文档章节

Java偏量锁

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

© 著作权归作者所有

共有 人打赏支持
下一篇: StringCalculator
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并发编程学习五:Synchronized的锁优化以及CAS

从前几章的学习当中,我们知道了volidate只能保证可见性以及部分的原子性,而针对大部分的并发场景而言,部分的原子性是满足不了项目需求的,因此使用了锁机制或者原子类操作来满足我们的开发...

JerryLin123
2018/11/22
0
0
Java并发之synchronized关键字

一.基本使用和语义 synchronized可以用于修饰方法或代码块。修饰代码块时锁是后面括号里的对象。修饰方法分为实例方法和静态方法。修饰实例方法时锁是调用方法的对象;修饰静态方法时锁是类对...

第四单元
2018/12/12
0
0
17《Java核心技术》之synchronized底层如何实现?什么是锁的升级、降级?

一、提出问题 我们在上一篇中对比和分析了 synchronized 和 ReentrantLock,算是进入并发编程阶段的热身,相信你已经对线程安全,以及如何使用基本的同步机制有了基础,今天我们将深入了解 ...

飞鱼说编程
2018/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

eclipse中项目svn转gitLab全过程

在工作中,我们可能会遇到项目从svn迁移到gitLab;此过程我们需要变化版本管理工具,上传代码。本篇博客记录了使用spring tool suit(sts/eclipse)进行项目迁移的全过程。 步骤: (1)端口之...

em_aaron
29分钟前
0
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
42分钟前
1
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0
看了一下Maven的内容

了解了Maven其实是一个跨IDE的标准构建工具,能推广的原因估计是借了仓库的便利。 另一个作用是可以通过Maven的功能在社区版的IDEA去创建Web项目,下次实践看看

max佩恩
昨天
5
0
day27:expect批量杀进程|

1、linux下当前目录有一个文件ip-pwd.ini,内容如下: [root@localhost_002 shell100]# cat ip-pwd.ini 10.111.11.1,root,xyxyxy10.111.11.2,root,xzxzxz10.111.11.3,root,12345610.......

芬野de博客
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部