java - 与同步类相比,使用非同步类的性能如何提高?

标签 java multithreading

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);
       }
      }
    }
    

    给出2241 ms的数字对于 StringBuffer753 ms对于 StringBuilder .

并根据this额外的代码是StringBuffer中的synchronized关键字。这个synchronized关键字是否会花费额外的1488ms,如果是的话,那么我们应该总是选择StringBuilder而不是StringBuffer吗?

提前致谢。

最佳答案

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

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

关于java - 与同步类相比,使用非同步类的性能如何提高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24820354/

相关文章:

multithreading - Powershell 运行空间和颜色输出

c++ - 使用 OpenMP 并行化内部循环

c# - Windows服务应用程序安装

java - RxJava - AbstractOnSubscribe 在 1.1.0 中去了哪里?

java - 启动过程的非法参数

java - 代码行的执行顺序

java - 时间只显示一种颜色

c# - 使用 BackgroundWorker 更新 C# Chart

multithreading - 如何从后台线程有效地对 Delphi 6 框架或表单执行图像流预览?

java - 在子类的构造函数中注册监听器