ReentrantLock
ReentrantLock内部有sync接口,sync有NonfairSyn和FairSync两个实现,这两个实现了lock和unlock方法
竞争锁用的是cas
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
竞争不到就重新尝试,依然得不到就加入队列,设置中断状态
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
加入队列时判断需要阻塞就会阻塞当前线程,使用了LockSupport工具的pack方法来实现阻塞
private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}
LockSupport工具的大多方法利用了UNSAFE类里的native方法
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
public native void park(boolean isAbsolute, long time);
本文详细解析了ReentrantLock的工作原理,包括其内部的sync接口,NonfairSync和FairSync的实现,以及如何通过CAS进行锁的竞争。同时,介绍了当线程竞争失败时的处理流程,包括加入等待队列和使用LockSupport工具进行线程阻塞。
627

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



