【锁】---AQS

上一篇文章介绍了JVM锁原理。其中有这样的过程:“其他线程来竞争锁,如果锁被占有,那么该线程进入等待队列。”
AQS:是AbstractQueuedSynchronizer的简称,它是一个Java提供的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。【原理:多个线程来竞争锁,只有一个线程获取到锁,其他线程放入等待队列。

一、AQS

【锁】---AQS_第1张图片

二、ReentrantLock来了解AQS内部原理

【锁】---AQS_第2张图片
上面图示是一般AQS的原理过程。ReentrankLock源码就是这样的思路。

一般的lock()方法就是获取锁,如果能获取到就进行执行,否则阻塞等待:

     final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

---------非公平锁是先利用CAS尝试去抢占锁,能抢占成功,那么设置state=1和对象独占锁线程为当前执行线程。否则进入acquire()的等待队列中。

public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

-----当前执行线程首先获取state值,不为0说明当前对象的锁被线程占有,接着判断占有的线程是不是自己,是的话累加state值【重入锁机制】,不是的话,说明是其他线程占用的,那么该当前执行线程进入等待队列。

你可能感兴趣的:(Java锁)