当前位置:首页 > 开发 > 编程语言 > Java > 正文

java 锁性能

发表于: 2014-10-08   作者:墙头上一根草   来源:转载   浏览:
摘要: java锁消耗的性能,主要是多线程先cpu对线程的调度消耗的,在有锁的情况下,cpu要调度某个线程可用,某个线程不可用,这些本来就是要消耗系统资源的。所以个人认为,多线程下性能下降的原因主要是两方便的,第一 锁消耗性能,第二是线程调度消耗性能。以下通过两个方便为别测试。       首先是单线程下,锁消耗的性能:    &

java锁消耗的性能,主要是多线程先cpu对线程的调度消耗的,在有锁的情况下,cpu要调度某个线程可用,某个线程不可用,这些本来就是要消耗系统资源的。所以个人认为,多线程下性能下降的原因主要是两方便的,第一 锁消耗性能,第二是线程调度消耗性能。以下通过两个方便为别测试。

 

    首先是单线程下,锁消耗的性能:

         public class Test {

    private static final int num = 500000000;
    
    public void cal(){
        long start = System.currentTimeMillis();
        int result = 0;
       
        for (int i = 0; i < num; i++) {
            result +=1;
        }
        System.out.println("cal计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start));
    }
    
    public  void cal2(){
        long start = System.currentTimeMillis();
        int result = 0;
       
        for (int i = 0; i < num; i++) {
            synchronized (this) {
                result +=1;
            }
        }
        System.out.println("cal2有锁计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start)+"\r");
    }
    
    public static void main(String[] args) {
       
        for (int i = 0; i < 10; i++) {
            Test test = new Test();
           
            test.cal();
            test.cal2();
        }
    }
}

   以下是执行结果为了测试的效果,执行10次看平均值:

     cal计算结果为: 500000000. 计算的时间为:271
cal2有锁计算结果为: 500000000. 计算的时间为:15220

cal计算结果为: 500000000. 计算的时间为:262
cal2有锁计算结果为: 500000000. 计算的时间为:1970

cal计算结果为: 500000000. 计算的时间为:270
cal2有锁计算结果为: 500000000. 计算的时间为:1228

cal计算结果为: 500000000. 计算的时间为:263
cal2有锁计算结果为: 500000000. 计算的时间为:1230

cal计算结果为: 500000000. 计算的时间为:262
cal2有锁计算结果为: 500000000. 计算的时间为:1355

cal计算结果为: 500000000. 计算的时间为:262
cal2有锁计算结果为: 500000000. 计算的时间为:1223

cal计算结果为: 500000000. 计算的时间为:263
cal2有锁计算结果为: 500000000. 计算的时间为:1234

cal计算结果为: 500000000. 计算的时间为:266
cal2有锁计算结果为: 500000000. 计算的时间为:1251

cal计算结果为: 500000000. 计算的时间为:264
cal2有锁计算结果为: 500000000. 计算的时间为:1230

cal计算结果为: 500000000. 计算的时间为:269
cal2有锁计算结果为: 500000000. 计算的时间为:1255

 

   从以上的测试结果可以看出有锁的要比无锁的,性能消耗大概在5倍,而且第一次执行的时候相差的都无法让人接受,当然和计算机的配置还是有一定的关系的,但是从这个简单的测试上可以看出,锁对程序的性能影响

 

   以下是多线程下,计算的结果,本次测试启用10个线程,每个线程单独计算五亿次

      public class Test {

    private static final int num = 500000000;
   
    public void cal(){
        long start = System.currentTimeMillis();
        int result = 0;
       
        for (int i = 0; i < num; i++) {
            result +=1;
        }
        System.out.println("cal计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start));
    }
   
    public  void cal2(){
        long start = System.currentTimeMillis();
        int result = 0;
       
        for (int i = 0; i < num; i++) {
            synchronized (this) {
                result +=1;
            }
        }
        System.out.println("cal2有锁计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start)+"\r");
    }
   
    public void cal3(){
        long start = System.currentTimeMillis();
        int result = 0;
        int index = 0;
       
        while(index<num){
            synchronized (this) {
                result+=1;
                index++;
            }
        }
        System.out.println(Thread.currentThread().getName()+" "+"有锁计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start)+"\r");
    }
   
    public static void main(String[] args) {
       
        for (int i = 0; i < 10; i++) {
//            Test test = new Test();
//           
//            test.cal();
//            test.cal2();
            Thread thread = new Thread(new Runnable() {
               
                @Override
                public void run() {
                    Test test = new Test();
                    test.cal3();
                }
            }, "线程"+i);
            thread.start();
        }
    }
}

 

   接下来看运算结果,表明多线程下的性能下降的更厉害

    线程5 有锁计算结果为: 500000000. 计算的时间为:62796

线程7 有锁计算结果为: 500000000. 计算的时间为:62957

线程9 有锁计算结果为: 500000000. 计算的时间为:62961

线程1 有锁计算结果为: 500000000. 计算的时间为:68265

线程2 有锁计算结果为: 500000000. 计算的时间为:85124

线程0 有锁计算结果为: 500000000. 计算的时间为:101602

线程3 有锁计算结果为: 500000000. 计算的时间为:103658

线程6 有锁计算结果为: 500000000. 计算的时间为:116141

线程8 有锁计算结果为: 500000000. 计算的时间为:122378

线程4 有锁计算结果为: 500000000. 计算的时间为:122773

java 锁性能

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
周末对Java中各种类型的锁做了基准评测。测试的条件有两个:1)是10、50、100个不同的并发线程,2)
在了解轻量级锁之前,首先要知道什么是CAS CAS--Compare And Swap 比较并交换--通过比较传入的旧值
如果你在大学学习过操作系统,你可能还记得监听器在操作系统中是很重要的概念。同样监听器在java同
概述 假如行为不同步在多线程环境下就会出现混乱。 在共享内存环境中读取一块由可能被多个线程更新的
1:在javaN(new)IO 中提供了文件锁的功能, 这样当一个线程文件锁定后, 其他的线程是无法操作此文件
多线程应用中,我们往往会对同一对象或类进行操作,这时我们需要应用同步锁,以保证程序的正常运行
Java中的锁 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复
synchronized,称为内部锁或监视器。 当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷
实现分布式锁的基本思路 采用 redis 和 zookeeper 的方式实现 采用 redis 实现分布式锁的基本思路通
java 同步锁(synchronized) java中cpu分给每个线程的时间片是随机的并且在java中好多都是多个线程
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号