文档章节

Java偏量锁

jimyao
 jimyao
发布于 2016/01/27 23:10
字数 447
阅读 85
收藏 0
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

© 著作权归作者所有

共有 人打赏支持
jimyao
粉丝 17
博文 66
码字总数 27856
作品 0
朝阳
Java SE1.6中的Synchronized

1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了J...

serenity
2015/07/15
0
0
CAS原理 Java SE1.6中的Synchronized

在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。 锁机制存在以下问题: (1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延...

指尖的舞者
2014/04/23
0
0
聊聊并发(二)Java SE1.6中的Synchronized

在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1....

陶邦仁
2015/03/18
0
0
Java SE1.6中的Synchronized详解

1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了J...

闵开慧
2013/08/06
0
0
Java并发机制及锁的实现原理

Java并发编程概述 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面...

烂猪皮
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
25分钟前
4
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
29分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
33分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
42分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部