在Java Docs中,StringBuffer
的方法是synchronized
。那么为什么我还需要在此问题中给出的示例中手动synchronize
StringBuffer
:here
我在某处读到,StringBuffer
超过StringBuilder
是不值得的,因为它(StringBuffer)比StringBuilder
慢。这样,这两者就像Vector
和ArrayList
一样。
但我想知道,为什么我们称之为StringBuffer
或Vector
)Thread Safe
类,当我们仍然需要手动将它们封装在synchronized
块中时在上面链接中提到的示例中。为什么我不能依赖它们。任何人都可以解释和清除我的怀疑。
有没有办法检查StringBuffer是否真的是一个线程安全类。
答案 0 :(得分:3)
StringBuffer
中的方法在内部同步,这意味着如果两个线程同时将一个String附加到缓冲区,则缓冲区不会交错字符串;它会追加一个然后另一个。
您链接的示例在字符串缓冲区实例上进行自我同步,这是完全不同的事情。
答案 1 :(得分:0)
使用时
synchronized(sb)
{
for(int i=1;i<=10;i++){
System.out.println(i+" : "+sb.charAt(0));
}
sb.setCharAt(0, (char) (sb.charAt(0)+1));
}
您正在同步整个块(即,当线程1使用此块时,在完成thread1之前不应使用其他线程)
如果你删除synchronized,在任何时候thread1都可能释放锁,所以thread2或者线程3可能会改变它的数据