Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与同步类相比,使用非同步类如何提高性能?_Java_Multithreading - Fatal编程技术网

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

Java 与同步类相比,使用非同步类如何提高性能?,java,multithreading,Java,Multithreading,在本教程中,StringBuffer是同步的,StringBuilder不是 一个类可以被同步吗 我知道,对于特定的线程,同步的方法是锁定的,而非同步的方法是不锁定的。但是,使用非同步的方法如何提高程序的性能呢 代码来自 给出StringBuffer的2241 ms与StringBuilder的753 ms的数值 根据外部代码,是StringBuffer中的同步关键字。这个同步关键字是否需要额外的1488ms,如果需要,我们是否应该总是选择StringBuilder而不是StringBuffer

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

  • 一个类可以被同步吗

  • 我知道,对于特定的线程,同步的方法是锁定的,而非同步的方法是不锁定的。但是,使用非同步的方法如何提高程序的性能呢

  • 代码来自

    给出
    StringBuffer
    2241 ms
    StringBuilder
    753 ms
    的数值

  • 根据外部代码,是StringBuffer中的同步关键字。这个同步关键字是否需要额外的1488ms,如果需要,我们是否应该总是选择StringBuilder而不是StringBuffer


    提前感谢。

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


    同步需要额外的步骤,因此显然对性能的影响很小。然而,这并不是你想要开始优化的地方。另外,无冲突同步应该是快速的,因此在大多数情况下使用
    StringBuffer
    而不是
    StringBuilder
    不会有任何区别。

    类可以同步吗?

    是的,您可以在类对象上进行同步(假设您指的是类对象)。在类的
    静态字段或静态成员上进行同步时,将同步类对象本身。因此,没有两个线程可以同时访问类级字段/方法

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

    同步是以锁定和释放对象的监视器为代价的,它还可以防止JVM重新构造代码(这样做是为了提高性能)

  • 我不知道你所说的“类可以被同步吗?”是什么意思,但一般来说,类可以被设计成线程安全的。这通常会涉及一些性能惩罚。使用synchronized关键字是实现线程安全性的最基本方法
  • 准确的性能惩罚将取决于很多事情。您链接的问题的一个答案给出了StringBuffer与StringBuilder的基准

  • @Pablo这不是重复的,我知道StringBuffer和StringBuilder之间的区别,我问的是两者的性能问题,而不是区别。区别正是性能。由于同步逻辑,StringBuffer速度较慢,即使您没有使用该功能。这个问题的答案是“微小”在旁观者的眼中。@jameslarge好吧,经验较少的人经常听到“同步很昂贵”,他们认为这是他们需要开始优化的第一个地方。不要介意数据库没有任何索引,让我们通过将所有
    StringBuffers
    更改为
    StringBuilders
    ,来提高性能吧!
     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);
       }
      }
    }