无锁&偏向锁&原子整型&轻量级锁在无锁竞争下的效率对比
1、无锁
private final static int TEST_VALUE=999999999;
public static void main(String[] args) {
long l=0;
long l1 = System.currentTimeMillis();
for(long i=0;i<TEST_VALUE;i++){
l++;
}
long l2 = System.currentTimeMillis();
System.out.println(l2-l1);
}
测试3组数据的结果:250、255、259
2、偏向锁
注意加VM参数:-XX:BiasedLockingStartupDelay=0
否则偏向锁启动默认约有4秒的延迟
private final static int TEST_VALUE=999999999;
public static void main(String[] args) {
long l=0;
long l1 = System.currentTimeMillis();
for(long i=0;i<TEST_VALUE;i++){
synchronized (o){
l++;
}
}
long l2 = System.currentTimeMillis();
System.out.println(l2-l1);
//-XX:BiasedLockingStartupDelay=0
}
测试3组数据的结果:1314、1348、1293
3、原子整形
private final static int TEST_VALUE=999999999;
public static void main(String[] args) {
AtomicLong l=new AtomicLong(0);
long l1 = System.currentTimeMillis();
for(long i=0;i<TEST_VALUE;i++){
l.addAndGet(1);
}
long l2 = System.currentTimeMillis();
System.out.println(l2-l1);
}
测试3组数据的结果:4236、4242、4233
4、synchronized轻量级锁
private final static int TEST_VALUE=999999999;
public static void main(String[] args) {
long l=0;
long l1 = System.currentTimeMillis();
for(long i=0;i<TEST_VALUE;i++){
synchronized (o){
l++;
}
}
long l2 = System.currentTimeMillis();
System.out.println(l2-l1);
}
测试3组数据的结果:8346、8377、8360
5、总结
在没有锁竞争情况下的效率:无锁>偏向锁>原子整型>轻量级锁
比例大约为1:5:15:30
不同机器的测试结果可能不太一样,但比例基本一致