java - 什么需要将 StringBuffer 绑定(bind)到同步块(synchronized block)?

标签 java multithreading synchronized stringbuffer

我有一个疑问。众所周知,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/

相关文章:

java - Mac OSX El Capitan 上的 OpenGL 3.3 和 LWJGL

C 和 OpenMP : nowait for loop in a do loop

c - 多个 pthread 加入一个 pthread 的替代方案?

java - 使用 CAS 代替同步

java - 为什么 set <Integer> 是对相加的值进行排序?

java - 基本递归枚举解释

java - Play[2.2] websocket 今日美国 api 错误 com.fasterxml.jackson.core.JsonParseException : Unexpected character ('<' (code 60)): expected a valid value

c++ - 线程 : How to calculate precisely the execution time of an algorithm (duration of function) in C or C++?

java - java中继承下的同步静态方法行为

java - 使用同步列表