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同步更有效率。