接上节,为了解决一、二两节出现的缺陷,Peterson锁实现出现了,这是一个经典的双线程锁实现,请看代码:
public class PertersonLockImpl implements Lock {
private volatile boolean[] b = new boolean[2];
private volatile int flag = 0;
public void init() {
b[0] = false;
b[1] = false;
}
public void lock() {
int currentTheradId = ThreadUtil.getCurrentId();
b[currentThreadId] = true;
flag = currentThreadId;
while(currentThreadId == flag && b[1 - currentThreadId]) {
}
}
public void unlock() {
int currentThreadId = ThreadUtil.getCurrentId();
b[currentThreadId] = false;
}
}
证明:此lock算法满足互斥。
不是一般性,如果线程A进入了 临界区,要么currentThreadId != flag,即线程B重置了flag,要么b[1 - currentThreadId] == false,即B线程执行完unlock方法,已经推出临界区。