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