为什么我们需要在其方法已经同步时同步StringBuffer

时间:2014-12-03 09:44:05

标签: java multithreading thread-synchronization

在Java Docs中,StringBuffer的方法是synchronized。那么为什么我还需要在此问题中给出的示例中手动synchronize StringBufferhere

我在某处读到,StringBuffer超过StringBuilder是不值得的,因为它(StringBuffer)比StringBuilder慢。这样,这两者就像VectorArrayList一样。

但我想知道,为什么我们称之为StringBufferVectorThread Safe类,当我们仍然需要手动将它们封装在synchronized块中时在上面链接中提到的示例中。为什么我不能依赖它们。任何人都可以解释和清除我的怀疑。

有没有办法检查StringBuffer是否真的是一个线程安全类。

2 个答案:

答案 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可能会改变它的数据