CAS(compareAndSet)算法及简单应用AtomicInteger

参照链接:

http://www.blogjava.net/syniii/archive/2010/11/18/338387.html?opt=admin

 

cas算法应用的场合:AsyncTask中为Thread生成唯一线程名,保证了getAndIncrement获取的值肯定是唯一的,但是不需要同步开销。

对于单一thread来说,返回前一个值。

如果是每次加一的话,current的每个值只能有一个线程设置成功,这样前面保存的current才会返回,假设保存current后,其他线程改变了current, getAndIncrement不会成功,这样保存的值无效,只能进行下次尝试。只有保存完current后,current没有变化,这样getAndIncrement成果后,才会返回current的。因此,返回的值肯定是新值的前一个值。设置每个新值的操作是惟一的,因此,返回值也是唯一的。
备份current后,getAndIncrement成功,没有其他线程改变current的值,可以返回current;否则,其他线程改变了current,只能进行下一次的尝试。

private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); } };

/** * Atomically increments by one the current value. * * @return the previous value */ public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return current; } }

你可能感兴趣的:(thread,算法,2010)