Den*_*nov 8 java concurrency java.util.concurrent
假设有以下两个计数器实现:
class Counter {
private final AtomicInteger atomic = new AtomicInteger(0);
private int i = 0;
public void incrementAtomic() {
atomic.incrementAndGet();
}
public synchronized void increment() {
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
乍一看,原子应该更快,更具可扩展性.我相信他们是.但它们总是比synchronized阻挡更快吗?或者这个规则被破坏时存在某些情况(例如SMP /单CPU机器,不同的CPU ISA,操作系统等)?
incrementAndGet可以实现为CAS循环.在高度满足的情况下,对于n个线程,可能导致n -1个线程失败导致O(n)问题.
(对于@Geek:
通常getAndIncrement可以实现如下:
int old;
do {
old = value;
} while (!compareAndSet(value, old, old+1));
return old;
Run Code Online (Sandbox Code Playgroud)
想象一下,你有一个n个线程在同一个原子上执行这个代码,它们碰巧是彼此同步的.第一次迭代不千牛工作.只有一个CAS会成功.其他n -1个线程将重复练习,直到只剩下一个.所以总工作量是O(n ^ 2)(最差情况)而不是O(n).)
话虽如此,获取一个锁将需要做类似的事情,并且当争议很大时,锁并不是最好的.在使用需要在get和compareAndSwap之前进行大量计算的CAS循环之前,您不太可能看到锁的优势.
| 归档时间: |
|
| 查看次数: |
785 次 |
| 最近记录: |