Java里的非阻塞算法
(2012年的文章,归档在此)
撰写一个非阻塞式代码如下:
public class NonblockingCounter {
private AtomicInteger value;
public int getValue() {
return value.get();
}
public int increment() {
int v;
do {
v = value.get();
} while (!value.compareAndSet(v, v + 1));
return v + 1;
}
}
当两个线程同时increment时,两个线程可能获取相同的v,此时其中一个线程的compareAndSet会失败,这样重新取v,进行新的compareAndSet
。
这样,不会出现两个线程取到同样的新的value值。
这样的方式,是乐观地估计线程不会撞车,只有真正撞车时,才重新处理。这样比假设一定会撞车,而将整个方法用syncronized同步更有效率。