java 之多线程 LOCK实现(三)
接上节,为了解决一、二两节出现的缺陷,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方法,已经推出临界区。
?
?
?