【发布时间】:2014-05-24 17:00:31
【问题描述】:
我有一个疑问。众所周知,StringBuffer 是线程安全的(它的方法是synchronized),而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 是线程安全的时,这意味着什么。谁能解开我对此的疑惑?
【问题讨论】:
-
StringBuffer的单个操作是线程安全的;两个操作,一个接一个,不是。请注意,Hashtable也是如此。
标签: java multithreading synchronized stringbuffer