1.公平鎖和非公平鎖釋放時,最後都要寫一個volatile變量的state。
protected final boolean tryRelease(int releases) {
int c = getState() - releases;
if (Thread.currentThread() != getExclusiveOwnerThread())
throw new IllegalMonitorStateException();
boolean free = false;
if (c == 0) {
free = true;
setExclusiveOwnerThread(null);
}
setState(c);
return free;
}
2.公平鎖獲取時,首先會去讀volatile變量。
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
3.非公平鎖獲取時,首先會用CAS更新volatile變量,這個操作同時具有volatile讀和voaltile寫的內存語義。
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
鎖釋放-獲取的內存語義的實現至少有2種:
1.利用volatile變量的寫-讀所具有的內存語義。
2.利用CAS所附帶的volatile讀和volatile寫的內存語義。