与同步类相比,使用非同步类的性能如何提高? [复制]

Posted

技术标签:

【中文标题】与同步类相比,使用非同步类的性能如何提高? [复制]【英文标题】:How performance is increased on using non-synchronised class as compared to synchronized class? [duplicate] 【发布时间】:2014-09-09 07:36:53 【问题描述】:

在this 教程中,StringBuffer 是同步的,而 StringBuilder 不是

    类可以同步吗?

    我知道同步方法是为特定线程锁定的,非同步方法没有。但是如何使用非同步方法提高程序的性能?

    来自here的代码

     public class Main 
        public static void main(String[] args) 
            int N = 77777777;
            long t;
    
        
            StringBuffer sb = new StringBuffer();
            t = System.currentTimeMillis();
            for (int i = N; i --> 0 ;) 
                sb.append("");
            
            System.out.println(System.currentTimeMillis() - t);
        
    
        
            StringBuilder sb = new StringBuilder();
            t = System.currentTimeMillis();
            for (int i = N; i --> 0 ;) 
                sb.append("");
            
            System.out.println(System.currentTimeMillis() - t);
       
      
    
    

    StringBuffer 提供2241 ms 的数字,而为StringBuilder 提供753 ms

根据this,extracode 是 StringBuffer 中的 synchronized 关键字。这个 synchronized 关键字是否会花费额外的 1488 毫秒,如果是,那么我们是否应该总是更喜欢 StringBuilder 而不是 StringBuffer?

提前致谢。

【问题讨论】:

@Pablo 它不是重复的,我知道 StringBuffer 和 StringBuilder 之间的区别,我问的是两者的性能问题而不是区别。 区别恰恰在于性能。由于同步逻辑,StringBuffer 速度较慢,即使您不使用该功能也是如此。该问题中的答案解决了 【参考方案1】:

不,无法同步课程。应该说StringBuffer 是线程安全的。

同步涉及额外的步骤,因此显然会对性能造成很小的影响。但是,这不是您要开始优化的地方。此外,无竞争同步应该很快,所以在大多数情况下使用 StringBuffer 代替 StringBuilder 不会有任何区别。

【讨论】:

“小”在旁观者的眼中。 @jameslarge 好吧,经验不足的人经常听到“同步很昂贵”,他们认为这是他们需要开始优化的第一个地方。没关系,数据库没有任何索引,让我们通过将所有StringBuffers 更改为StringBuilders 来提高性能,哇!【参考方案2】:

类可以同步吗?

是的,您可以在 Object 类上进行同步(假设您指的是 Object 类)。当您在一个类的static fields or static members 上进行同步时,该类对象本身将被同步。因此,没有两个线程可以同时访问类级别的字段/方法。

我知道同步方法是针对特定线程锁定的,非同步方法没有。但是如何使用非同步方法提高程序的性能?

同步是以锁定和释放对象的监视器为代价的,它还防止了 JVM 的代码重组(这样做是为了更好的性能)。

【讨论】:

【参考方案3】:
    我不确定您所说的“课程可以同步吗?”是什么意思?但一般来说,类可以设计为线程安全的。这通常会涉及一些性能损失。使用 synchronized 关键字是实现线程安全的最基本方法。 确切的性能损失取决于很多因素。您链接到的问题的答案之一提供了 StringBuffer 与 StringBuilder 的基准。

【讨论】:

以上是关于与同步类相比,使用非同步类的性能如何提高? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

mysql 主从同步 与 半同步

区分同步代码块静态同步方法非静态同步方法的锁

CountDownLatch同步工具类的使用

阻塞与同步、非阻塞和异步有啥区别? [复制]

FileStream类的使用

简单测试Java线程安全中阻塞同步与非阻塞同步性能