StringBuilder类的线程安全性

时间:2014-06-21 16:05:01

标签: c# multithreading thread-safety stringbuilder

class Test {
    public string GetData() {
        StringBuilder sb = new StringBuilder();
        sb.Append("aassffss");
        sb.Append("bbhhhhh");
        return sb.ToString();
    }
}
// calling from multithreads,as below, 
// from each thread i will create new 
// instance and call method.

Test t = new Test(); 
t.GetData();

根据MSDN。 StringBuilder类的任何实例成员都不是线程安全的。 所以我相信这不是线程安全的。我是对的吗?

2 个答案:

答案 0 :(得分:7)

此代码是线程安全的,因为线程之间没有共享实例。

如果您在多个线程之间共享一个实例,则会遇到问题。然后,如果您有来自不同线程的多个实例方法调用,则在同一实例上,代码将是不安全的。

答案 1 :(得分:0)

假设您有两个线程t0和t1。两者都使用StringBuilder sb的共享实例。每个线程运行以下相应的方法T0 T1

public void T0()
{
    sb.Append("0");
    sb.Append("0");
}

public void T1()
{
    sb.Append("1");
    sb.Append("1");
}

然后您可能会在sb.ToString()

上获得以下输出
0011
0101
0110
1010
1100

因此,当使用两个调用非同步共享变量的线程时,上述任何组合都是ToString方法的可想到的结果。在这种情况下,共享变量是sb实例,其中问题出在类中。在内部,通过调用该实例上的Append方法来填充一些缓冲区。该缓冲区变量是有效共享的变量。

回到你的问题:你的代码是线程安全的,只要你不与其他线程共享实例并调用共享变量的方法。如果共享,您需要自己同步呼叫。然后考虑实现同步包装器。