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