java并发编程(一):计数器

时间:2022-12-17 16:21:15

买了一本《java并发编程的艺术 》,开启学习并发编程之路。 

根据jdk提供的原生的原子变量计数。

package test201603;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
* 计数器
*/
public class Counter {

private AtomicInteger atomicI = new AtomicInteger(0);

public static void main(String[] args) {
final Counter cas = new Counter();
List<Thread> ts = new ArrayList<Thread>(600);
for (int j = 0; j < 100; j++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
cas.safeCount();
}
}
});
ts.add(t);
}
//开启所有线程
for (Thread t : ts) {
t.start();
}
// 等待所有线程执行完成
for (Thread t : ts) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(cas.atomicI.get());
}

/**
* 使用CAS实现线程安全计数器
*/
private void safeCount() {
for (;;) {
int i = atomicI.get();
boolean suc = atomicI.compareAndSet(i, ++i);
if (suc) {
break;
}
}
}

}


根据上面的代码,其中compareAndSet方法是关键,safeCount方法里面有一个死循环,首先获得当前值i,然后当前值加1作为更新值,如果当前值i没有发生变化则用更新值替换当前值,如果当前值改变了,那么就继续循环下去。