目录
前文
多线程之间常见同步方式 :Synchronized / Lock / volitial + CAS 等,在不同的并发量和不同并发场景下性能不尽相同,尤其是Synchronized在不断经过优化之后性能得到了提升,而且无锁化CAS编程也成为了一些框架提升性能的手段,在JDK 8中,处理已有的原子类之外,添加了LongAdder和LongAccumulator原子类,除去应用场景不说,性能要比原始的原子类性能要好。
LongAdder的实现原理是将原本的value,切分成了多个数组,每个线程单独操作数组中自己对应的值,在获取LongAdder的结果的时候,需要对数组中所有的值进行求和sum操作,LongAccumulator是LongAdder的功能增强版本,原理类似。
正文
以下分别对Synchronized、AtomicLong和LongAdder在多线程下的性能进行简单测试。
0. 测试环境
测试环境就不详细给出了,个人mac pro电脑,编译器:idea ,jdk 8……
1. Synchronized 测试
所需代码:
private static final int MAX_THREADS = 3; //线程数
private static final int TARGET_COUNT = 10000000; //目标总数
//用于统计完成子线程数目
static CountDownLatch cdlsync = new CountDownLatch(MAX_THREADS);
//所需要同步的变量
private long count = 0;
//同步的方法
protected synchronized long getCount(){
return count;
}
protected synchronized long inc(){
//如果不在这里进行越界判断,会出现超出TARGET_COUNT的情况
if(co