`
墙头上一根草
  • 浏览: 154520 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 锁性能

    博客分类:
  • java
阅读更多

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程序性能优化》(葛一鸣)PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一本关于Java程序性能优化的书籍,作者是葛一鸣,并提供了该书PDF版本的下载链接。虽然没有具体的书籍内容,但基于标题、描述以及通常这类书籍会涉及的主题,我们可以总结出...

    Java锁机制详解.pdf

    Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...

    彻底理解Java中的各种锁.pdf

    通过以上对Java锁机制的详细介绍,可以看出Java在并发控制方面具有丰富的工具和策略,它们能够帮助开发者在多线程编程中处理好资源竞争和线程协作的问题,从而编写出高效且线程安全的应用程序。

    提升Java的锁性能Java开发Java经验技巧共5页.p

    在Java开发过程中,锁性能是决定程序并发效率的关键因素之一。高效的锁机制能够确保多线程环境中的数据一致性,减少资源争抢,从而提高应用程序的性能。本篇内容将深入探讨如何提升Java的锁性能,结合Java开发的经验...

    Java程序性能优化 让你的Java程序更快、更稳定

    Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...

    阿里+Java+开发手册、阿里巴巴Java性能调优实战

    《阿里+Java+开发手册、阿里巴巴Java性能调优实战》是两本专注于Java开发和性能优化的专业书籍,分别以嵩山版和华山版的形式呈现,由阿里巴巴集团编写。这两本书籍结合了阿里巴巴在实际业务场景中的丰富经验,旨在...

    java锁的释放与建立

    本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`...

    Java锁的种类以及区别

    ### Java锁的种类及其区别 在Java编程语言中,锁是一种重要的同步机制,用于控制多个线程对共享资源的访问,防止数据不一致等问题的发生。本文将详细介绍Java中几种常见的锁类型及其之间的区别。 #### 一、公平锁...

    面向Java锁机制的字节码自动重构框架.zip

    总的来说,Java锁机制是保证多线程安全的关键,而面向Java锁机制的字节码自动重构框架则是提高并发性能的一种高级技术。它通过深入字节码层面,提供了一种自动优化锁使用的方式,帮助开发者更有效地管理和优化并发...

    Java程序性能优化 让你的Java程序更快、更稳定pdf文档视频资源

    Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够带来显著的业务优势。本资源包含一个PDF文档和相关的视频教程,旨在帮助你提升Java程序的速度和稳定性。 首先...

    java锁机制详解.pdf

    Java锁机制是多线程编程中的关键概念,用于控制对共享资源的并发访问。在Java中,主要的锁机制包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。下面将详细讲解这两种锁机制及其应用。 1. `...

    java 读写锁代码

    - 在需要大量并发读取,偶尔修改的数据结构中,使用读写锁能有效提高程序性能。 - 在`readwritelock`这个示例中,可能包含了创建`ReentrantReadWriteLock`对象,获取读锁和写锁的代码,并通过注释解释了其工作原理...

    4种常用Java线程锁的特点,性能比较、使用场景.pdf

    4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...

    Java的锁机制的学习和使用

    #### 一、Java锁机制概览 Java中的锁机制主要用于解决多线程环境下的资源竞争问题。在并发编程中,为了保证数据一致性与正确性,通常需要采用各种锁来控制对共享资源的访问。Java语言提供了多种锁机制,包括`...

    java性能优化集锦

    5. **避免大量使用synchronized**:同步锁会降低并发性能,可考虑使用ConcurrentHashMap等并发容器。 6. **使用适当的集合类型**:选择适合场景的集合类型,如ArrayList、LinkedList、HashSet等。 7. **避免空对象...

    Java程序性能优化 让你的Java程序更快、更稳定.zip

    2. 正确使用synchronized:过多的同步可能导致性能瓶颈,应尽量减少同步块的范围,或者使用锁分离、读写锁等高级并发技术。 3. 避免死锁:确保线程间不会陷入死锁状态,避免程序的不稳定性。 五、数据库优化 1. ...

    大话JAVA性能优化

    但根据标题《大话JAVA性能优化》和描述“虽然有些地方可能过时,但是还是可以一读”以及标签“java 优化”,可以推断出书籍内容可能围绕Java编程语言的性能优化相关知识。基于这些信息,我们可以构建关于Java性能...

Global site tag (gtag.js) - Google Analytics