与同步类相比,使用非同步类的性能如何提高? [复制]
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 的基准。
【讨论】:
以上是关于与同步类相比,使用非同步类的性能如何提高? [复制]的主要内容,如果未能解决你的问题,请参考以下文章