多线程 +1操作的几种实现方式,及效率对比
来源:互联网 发布:2016淘宝刷流量 编辑:程序博客网 时间:2024/06/05 06:19
比较LongAdder ,Atomic,synchronized 以及使用Unsafe类中实现的cas 和模拟Atomic,在多线程下的效率 ,见代码,放开对应注释,运行即可看到结果,通过更改线程数,可以查看不同并发情况下性能对比,通过更改循环执行次数,可以查看长时间或短时间持续并发情况下性能对比;
测试服务器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;不同情况下性能表现很不稳定; 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); } }
0 0
- 多线程 +1操作的几种实现方式,及效率对比
- 【转】关于几种访问GameObject方式的效率对比
- Linux下的几种文件拷贝方式效率对比
- 几种多线程的操作方式
- iOS中多线程的实现方式及对比
- Java多线程的简单实现以及耗时操作的效率对比
- iOS 多线程的几种实现方式
- 8.19 多线程的几种实现方式
- 多线程的几种实现方式
- 多线程的几种实现方式
- 实现多线程 的几种方式
- 多线程的几种实现方式
- 多线程的几种实现方式
- Neo4J几种数据导入方式的效率对比
- HTMl5的几种存储方式及对比
- ArcGIS Engine中导入数据的几种方式及其效率对比
- 单例模式的几种实现方式的对比
- 四种读入方式的效率对比
- 使用Eclipse中提供的Refactor(重构)工具
- rtmpdump 捕获 rtmp视频数据 本地存储为 flv文件
- 可扩展架构取舍
- Spring MVC 拦截器(HandlerInterceptor)使用
- linux常用命令加实例大全
- 多线程 +1操作的几种实现方式,及效率对比
- mutable关键字
- Loadrunner通过吞吐量计算每个用户需要的带宽
- Loadrunner通过吞吐量计算每个用户需要的带宽
- tslib1.4移植到开发板中环境变量的设置
- MVC框架
- scala 中Array 和 ArrayBuffer的 区别
- Python基于BaseHTTPRequestHandler的HTTP代理V1.0
- Java 基础 ---二分查找法