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);