为什么要使用StringBuilder?StringBuffer可以使用多个线程以及一个线程吗?

MAN*_*HAK 16 java stringbuilder multithreading synchronization stringbuffer

假设我们的应用程序只有一个线程.我们正在使用StringBuffer那么问题是什么?

我的意思是如果StringBuffer可以通过同步处理多个线程,使用单线程有什么问题?

为什么要用StringBuilder呢?

sgo*_*les 27

StringBuffers是线程安全的,这意味着它们具有控制访问的同步方法,因此一次只有一个线程可以访问StringBuffer对象的同步代码.因此,StringBuffer对象通常可以安全地在多线程环境中使用,其中多个线程可能试图同时访问同一个StringBuffer对象.

StringBuilder's访问不同步,因此它不是线程安全的.通过不同步,StringBuilder的性能可以比StringBuffer更好.因此,如果您在单线程环境中工作,则使用StringBuilder而不是StringBuffer可能会提高性能.对于其他情况也是如此,例如StringBuilder局部变量(即方法中的变量),其中只有一个线程将访问StringBuilder对象.

所以,更喜欢StringBuilder因为,

  • 性能小.
  • StringBuilder是StringBuffer类的1:1替代品.
  • StringBuilder不是线程同步的,因此在大多数Java实现上表现更好

看一下这个 :


Bar*_*den 7

StringBuilder应该更快(微小),因为它不同步(线程安全).

您可以注意到真正繁重的应用程序的差异.

StringBuilder类通常应优先于此使用,因为它支持所有相同的操作,但速度更快,因为它不执行同步.

http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html

  • 澄清一下:即使一个线程正在使用一个对象,同步方法也会强制线程为每次访问获取和释放监视器.这可能会减慢程序的速度. (3认同)

Pet*_*rey 5

在多个线程中使用StringBuffer是无用的,实际上几乎从未发生过.

考虑以下

Thread1: sb.append(key1).append("=").append(value1);
Thread2: sb.append(key2).append("=").append(value2);
Run Code Online (Sandbox Code Playgroud)

每个追加都是同步的,但是线程可以随时弯腰,这样你就可以拥有以下任何组合等等

key1=value1key2=value2
key1key2==value2value1
key2key1=value1=value2
key2=key1=value2value1
Run Code Online (Sandbox Code Playgroud)

这可以通过一次同步整行来避免,但是这使得使用StringBuffer而不是StringBuilder失败了.

即使你有一个正确同步的视图,它也比创建整行的线程本地副本更复杂,例如StringBuilder和日志行一次到类似Writer的类.