同步块可以比Atomics更快吗?

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,操作系统等)?

Tom*_*ine 5

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循环之前,您不太可能看到锁的优势.