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写的内存语义。