我有一个疑问。众所周知,StringBuffer
是线程安全的(它的方法是同步的
),而 StringBuilder
不是线程安全的。
如果StringBuffer
本身是线程安全的,那我修改的时候为什么还要把它封装在synchronized block
中呢。下面是代码:
class SyncTest extends Thread
{
StringBuffer sb;
public SyncTest(StringBuffer sb)
{
this.sb = sb;
}
public void run()
{
synchronized(sb)
{
for(int i = 1;i<=10;++i)
{
System.out.print(sb);
}
sb.setCharAt(0, (char) (sb.charAt(0)+1));// incrementing the char by 1, thus modifying the StringBuffer
}
}
public static void main(String [] args)
{
StringBuffer sb = new StringBuffer("A");
new SyncTest(sb).start();
new SyncTest(sb).start();
new SyncTest(sb).start();
}
}
输出:
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC
当我删除 synchronized block
时,输出会发生变化,如下所示:
AAAAAAAAAAAAAAAAA
ABBBBBBBB
ACCC
那么,当我们说 StringBuffer
是线程安全的时,这意味着什么。谁能消除我对此的疑虑?
最佳答案
您正在执行复合操作。你既要显示它又要修改它。这两个操作本身都是线程安全的,但当这样组合时,它们就不是了。
一个线程可以修改内容,而另一个线程正在显示单个字符。
关于java - 什么需要将 StringBuffer 绑定(bind)到同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847570/