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
类的任何实例成员都不是线程安全的。
所以我相信这不是线程安全的。我是对的吗?
答案 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
方法来填充一些缓冲区。该缓冲区变量是有效共享的变量。
回到你的问题:你的代码是线程安全的,只要你不与其他线程共享实例并调用共享变量的方法。如果共享,您需要自己同步呼叫。然后考虑实现同步包装器。