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

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

  1. 类可以同步吗?

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

  3. 来自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 速度较慢,即使您不使用该功能也是如此。该问题中的答案解决了

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

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

类可以同步吗?

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

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

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

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2022-10-15
      相关资源
      最近更新 更多