Java偏量锁
2016-01-27 00:00
405 查看
import java.util.Random; import java.util.concurrent.*; /** * Created by Administrator on 2016/1/27. * JDK 1.8.0_65 */ public class Test5 { private static final int NTHREAD = 4; private static final int COUNTER = 10000000; private static Random random = new Random(123); private static ExecutorService es1 = Executors.newSingleThreadExecutor(); private static ExecutorService es2 = Executors.newFixedThreadPool(NTHREAD); private static ThreadLocal<Random> tl = new ThreadLocal<Random>() { @Override protected Random initialValue() { return new Random(123); } }; private static class Task implements Callable<Long> { private int mode = 0; public Task(int mode) { this.mode = mode; } public Random getRandom() { if (mode == 0) { return random; } else if (mode == 1) { return tl.get(); }else return null; } @Override public Long call() throws Exception { long start = System.currentTimeMillis(); for(long i = 0; i < COUNTER; i++) { getRandom().nextInt(); } long end = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + "spend " + (end - start) + " ms"); return (end - start); } } public static void main(String... args) throws ExecutionException, InterruptedException { Future<Long> futs1 = es1.submit(new Task(0)); long time1 = 0; time1 += futs1.get(); System.out.println("+UseBiasedLocking : " + time1 + " ms"); //System.out.println("-UseBiasedLocking : " + time1 + " ms"); es1.shutdown(); Future<Long>[] futs2 = new Future[NTHREAD]; for(int i = 0; i < NTHREAD ; i++) { futs2[i] = es2.submit(new Task(0)); } long time2 = 0; for(int i = 0; i < NTHREAD ; i++) { time2 += futs2[i].get(); } System.out.println("N Thread access one Random instance : " + time2 + " ms"); for(int i = 0; i < NTHREAD ; i++) { futs2[i] = es2.submit(new Task(1)); } long time3 = 0; for(int i = 0; i < NTHREAD ; i++) { time3 += futs2[i].get(); } System.out.println("ThreadLocal access one Random instance : " + time3 + " ms"); es2.shutdown(); } }
//可以明显的看到使用偏向锁,单线程时间减少,但是多线程时间延长
pool-1-thread-1spend 563 ms
+UseBiasedLocking : 563 ms
pool-2-thread-4spend 2121 ms
pool-2-thread-2spend 2130 ms
pool-2-thread-3spend 2309 ms
pool-2-thread-1spend 2310 ms
N Thread access one Random instance : 8870 ms
pool-2-thread-2spend 1563 ms
pool-2-thread-4spend 1714 ms
pool-2-thread-1spend 1603 ms
pool-2-thread-3spend 1784 ms
ThreadLocal access one Random instance : 6664 ms
//可以明显的看到禁用偏向锁,单线程时间延长,但是多线程时间减少
-UseBiasedLocking
pool-1-thread-1spend 760 ms
-UseBiasedLocking : 760 ms
pool-2-thread-1spend 1153 ms
pool-2-thread-3spend 1141 ms
pool-2-thread-4spend 1713 ms
pool-2-thread-2spend 2081 ms
N Thread access one Random instance : 6088 ms
pool-2-thread-1spend 1131 ms
pool-2-thread-3spend 1027 ms
pool-2-thread-4spend 1463 ms
pool-2-thread-2spend 1648 ms
ThreadLocal access one Random instance : 5269 ms
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树