class="java" name="code">
//ReentrantReadWriteLock的WriteLock
//WriteLock的lock方法
public void lock() {
sync.acquire(1);
}
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
protected final boolean tryAcquire(int acquires) {
Thread current = Thread.currentThread();
//获取state状态
int c = getState();
int w = exclusiveCount(c);
//如果c不为0说明当前有线程获取了锁
if (c != 0) {
// (Note: if c != 0 and w == 0 then shared count != 0)
//当前线程不是当前正在运行的独占线程
if (w == 0 || current != getExclusiveOwnerThread())
return false;
if (w + exclusiveCount(acquires) > MAX_COUNT)
throw new Error("Maximum lock count exceeded");
// Reentrant acquire
setState(c + acquires);
return true;
}
if (writerShouldBlock() ||
!compareAndSetState(c, c + acquires))
return false;
setExclusiveOwnerThread(current);
return true;
}
final boolean writerShouldBlock() {
return false; // writers can always barge
}
//WriteLock简单来说就是判断当前有没有线程占用锁,有则入队等待唤醒。没有直接占用运行。
WriteLock的unlock方法:
public void unlock() {
sync.release(1);
}
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
//设置状态以及将独占线程设置为null
protected final boolean tryRelease(int releases) {
if (!isHeldExclusively())
throw new IllegalMonitorStateException();
int nextc = getState() - releases;
boolean free = exclusiveCount(nextc) == 0;
if (free)
setExclusiveOwnerThread(null);
setState(nextc);
return free;
}
//WriteLock的其他方法和Reentrant基本一致。WriteLock本身就相当于ReentrantLock互斥锁。