07并发编程_AQS

什么是AQS?

        AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。

AQS使用方式和其中的设计模式

继承、模板方法设计模式

了解其用法

模板方法

    独占式获取锁

          acquire

          acquireInterruptily

          tryAcquireNanos

共享式获取锁

         acquireShared

         acquireSharedInterruptily

         tryAcquireShareNanos

独占式释放锁

         release

共享式释放锁

         releaseShared

需要子类覆盖的流程方法

     独占式获取锁

          tryAcquire

     独占式释放

         tryRelease

共享式获取

        tryAcquireShared

共享式释放

       tryReleaseShared

这个同步器是否处于独占模式

       isHeldExclusively

同步状态state

        getState:获取当前的同步状态

       setState: 设置当前的同步状态

       compareAndSetState,使用CAS设置状态,保证状态设置的原子性

实现一个类似于ReentrantLock的锁

public class SelfLock implements Lock {

    //state 表示获取到锁 state = 1表示获取到锁
    //state = 0 表示没有获取锁
    private static class Sync extends AbstractQueuedSynchronizer{

        //是否处于占用
        protected boolean idHeldExclusively(){
            return getState() == 1;
        }

        protected boolean tryAcquire(int arg){
            if(compareAndSetState(0,1)){
                //表示当前线程拿到了锁
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }

        protected boolean tryRelease(int arg){
            if(getState() == 0){
                throw new UnsupportedOperationException();
            }
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }

        Condition newCondition(){
            return new ConditionObject();
        }
    }

    private final Sync sync = new Sync();

    @Override
    public void lock() {
        //因为是独占锁
        sync.acquire(1);
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {
        sync.acquireInterruptibly(1);
    }

    @Override
    public boolean tryLock() {
        return sync.tryAcquire(1);
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return sync.tryAcquireNanos(1,unit.toNanos(time));
    }

    @Override
    public void unlock() {
        sync.release(1);
    }

    @Override
    public Condition newCondition() {
        return sync.newCondition();
    }
}
public class TestSelfLock {

    public void test(){
        final Lock lock = new SelfLock();
        class Worker extends Thread{

            public void run(){
                while(true){
                    try {
                        lock.lock();
                        SleepTools.ms(1);
                        System.out.println(Thread.currentThread().getName());
                        SleepTools.ms(1);
                    } finally {
                        lock.unlock();
                    }
                    SleepTools.ms(2);
                }
            }
        }

        for (int i = 0; i < 10; i++) {
            Worker w = new Worker();
            w.setDaemon(true);
            w.start();
        }

        for (int i = 0; i < 10; i++) {
            SleepTools.ms(10);
            System.out.println();
        }
    }

    public static void main(String[] args) {
        TestSelfLock testSelfLock = new TestSelfLock();
        testSelfLock.test();
    }
}

 源码分析参考 https://www.cnblogs.com/fanBlog/p/9336126.html  这篇文章,很详细

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AQS(AbstractQueuedSynchronizer)是Java并发编程中的一个重要类,它可以理解为抽象的队列同步器。AQS提供了一种基于FIFO队列的同步机制,用于实现各种同步器,如ReentrantLock、CountDownLatch、Semaphore等。 AQS的核心思想是使用一个volatile的int类型变量state来表示同步状态,通过CAS(Compare and Swap)操作来实现对state的原子更新。AQS内部维护了一个双向链表,用于保存等待获取同步状态的线程。 AQS的具体实现包括以下几个方面: 1. 内部属性:AQS内部有两个重要的属性,一个是head,表示队列的头节点;另一个是tail,表示队列的尾节点。 2. 入队操作:AQS的入队操作是通过enq方法实现的。在入队操作中,首先判断队列是否为空,如果为空,则需要初始化队列;否则,将新节点添加到队列的尾部,并更新tail指针。 3. CAS操作:AQS的CAS操作是通过compareAndSetHead和compareAndSetTail方法实现的。这些方法使用CAS操作来更新head和tail指针,保证操作的原子性。 4. 出队操作:AQS的出队操作是通过deq方法实现的。在出队操作中,首先判断队列是否为空,如果为空,则返回null;否则,将头节点出队,并更新head指针。 5. 同步状态的获取和释放:AQS提供了acquire和release方法来获取和释放同步状态。acquire方法用于获取同步状态,如果获取失败,则会将当前线程加入到等待队列中;release方法用于释放同步状态,并唤醒等待队列中的线程。 通过继承AQS类,可以实现自定义的同步器。具体的实现方式是重写AQS的几个关键方法,如tryAcquire、tryRelease等,来实现对同步状态的获取和释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值