循环CAS实现原子操作
public class Counter {
private AtomicInteger atomicI = new AtomicInteger(0);
private int i = 0;
public static void main(String[] args) {
final Counter cas = new Counter();
List<Thread> ts = new ArrayList<>(600);
long start = System.currentTimeMillis();
for (int j = 0; j < 100; j++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
cas.count();
cas.safeCount();
}
}
});
ts.add(thread);
}
// 启动所有线程
for (Thread t : ts) {
t.start();
}
// 等待所有线程执行完成
for (Thread t : ts) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(cas.i);
System.out.println(cas.atomicI.get());
System.out.println(System.currentTimeMillis() - start);
}
/**
* 使用cas实现线程安全计数器
*/
private void safeCount() {
for (;;) {
int i = this.atomicI.get();
boolean suc = this.atomicI.compareAndSet(i, ++i);
if (suc) {
break;
}
}
}
/**
* 非安全计数器
*/
private void count() {
this.i++;
}
}
执行结果:
摘自《Java多线程并发编程艺术》