1、测试类
lock.lock();
点击lock()进入如下代码
2、ReentrantLock类
public void lock() {
sync.lock();
}
点击lock()进入如下代码
3、NonfairSync内部类
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
分析:
1)AQS里有一个核心变量,state,代表了锁的状态。下面这行代码的意思,如果state是0(没人加锁),把这个state设置为1 (加锁),并返回true;否则加锁失败,返回false。
if (compareAndSetState(0, 1)):
点击compareAndSetState(0, 1)进入如下代码
2)如果加锁成功,就需要设置一下自己是当前加锁的线程
setExclusiveOwnerThread(Thread.currentThread());
4、AbstractQueuedSynchronizer类
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
说明加锁的底层是基于Unsafe来实现,这个jdk内部使用的类,封装了一些指针操作,基于cpu指令实现原子性的CAS。
5、总结
1)加锁的原理,就是用CAS技术设置AQS的state变量,设置成功再设置exclusiveOwnerThread为当前加锁线程。
2)Lock API性能比较好,CAS无锁化,乐观锁的思路
214

被折叠的 条评论
为什么被折叠?



