多线程 +1操作的几种实现方式,及效率对比
2017-02-28 16:40
417 查看
比较LongAdder ,Atomic,synchronized 以及使用Unsafe类中实现的cas 和模拟Atomic,在多线程下的效率 ,见代码,放开对应注释,运行即可看到结果,通过更改线程数,可以查看不同并发情况下性能对比,通过更改循环执行次数,可以查看长时间或短时间持续并发情况下性能对比;
测试服务器cpu 为i3-4170, 4核 3.7GHz
测试服务器cpu 为i3-4170, 4核 3.7GHz
import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.LongAdder; import sun.misc.Unsafe; /** * 线程安全的+1操作实现种类 * @author Administrator * */ public class Test extends Thread { //整体表现最好,短时间的低并发下比AtomicInteger性能差一点,高并发下性能最高; private static LongAdder longAdder = new LongAdder(); //短时间低并发下,效率比synchronized高,甚至比LongAdder还高出一点,但是高并发下,性能还不如synchronized;不同情况下性能表现很不稳定;可见atomic只适合锁争用不激烈的场景 private static AtomicInteger atomInteger = new AtomicInteger(0); //单线程情况性能最好,随着线程数增加,性能越来越差,但是比cas高 private static int $synchronized = 0; //高并发下,cas性能最差,(貌似unsafe类的方法本身就是线程安全的不需要volatile修饰) public static volatile int cas = 0; private static long casOffset; public static Unsafe UNSAFE; static { try { @SuppressWarnings("ALL") Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); UNSAFE = (Unsafe) theUnsafe.get(null); casOffset = UNSAFE.staticFieldOffset(Test.class.getDeclaredField("cas")); } catch (Exception e) { e.printStackTrace(); } } //乐观锁 调用unsafe类实现cas public void cas(){ boolean bl = false; int tmp; while(!bl){ tmp = cas; bl = UNSAFE.compareAndSwapInt(Test.class, casOffset, tmp,tmp+1); } } //模拟AtomicInteger的实现 public void atomicInteger(){ UNSAFE.getAndAddInt(this, casOffset, 1); } //对a执行+1操作,执行10000次 public void run(){ int i =1; while(i<=10000000){ //测试AtomicInteger atomInteger.incrementAndGet(); //atomicInteger实现; // atomicInteger(); //测试LongAdder // longAdder.increment(); //测试volatile和cas 乐观锁 // cas(); //测试锁 // synchronized(lock){ // ++$synchronized; // } i++; } } public static void main(String[] args){ long start = System.currentTimeMillis(); //100个线程 for(int i =1 ; i<=60;i++ ){ new Test().start(); } while(Thread.activeCount()>1){ Thread.yield(); } System.out.println(System.currentTimeMillis() - start); System.out.println($synchronized); System.out.println(atomInteger); System.out.println(longAdder); System.out.println(cas); } }
相关文章推荐
- 多线程 +1操作的几种实现方式,及效率对比
- Java多线程的简单实现以及耗时操作的效率对比
- 将List按照指定大小等分的几种实现方式和效率对比及优化
- 生成大量随机字符串不同实现方式的效率对比
- delphi 中几种多线程操作方式
- delphi 中几种多线程操作方式
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- 生成大量随机字符串不同实现方式的效率对比
- java多线程都有几种方式实现
- iOS中多线程的几种实现方式
- Java多线程:Producer-Consumer不同的几种实现方式
- 请问实现多线程有几种方式?他们的区别是什么?
- .NET下几种XML操作方式的性能对比
- 实现序列化几种方式的对比
- iOS中多线程的实现方式及对比
- XML:.NET下几种XML操作方式的性能对比
- 生成大量随机字符串不同实现方式的效率对比
- java多线程都有几种方式实现
- delphi 中几种多线程操作方式
- delphi中几种多线程操作方式