绝对没有;这里是一个简单的例子,从4.0通过反射器解除:
[SecuritySafeCritical]
public StringBuilder Append(char value)
{
if (this.m_ChunkLength < this.m_ChunkChars.Length)
{
this.m_ChunkChars[this.m_ChunkLength++] = value;
}
else
{
this.Append(value, 1);
}
return this;
}
该属性只处理调用者,而不是线程安全;这绝对是不是线程安全的。
更新:看他引用的源代码,这显然不是当前的.NET 4.0代码库(比较几种方法)。也许他正在谈论一个特定的.NET版本,或者可能是XNA - 但它通常是而不是。 4.0 StringBuilder
不具有具有 a m_currentThread
字段,加文的来源材料使用;有一个提示(一个未使用的常量ThreadIDField
),它使用存在,但不再...。
如果你想有一个直接反证 - 4.0上运行此;它很可能会给出错误的长度(我在4k区域看到了一些,在2k区域看到了一些 - 它应该恰好为5000),但其他一些方法(例如Append(char)
)更倾向于抛出异常根据定时:
var gate = new ManualResetEvent(false);
var allDone = new AutoResetEvent(false);
int counter = 0;
var sb = new StringBuilder();
ThreadStart work = delegate
{
// open gate when all 5 threads are running
if (Interlocked.Increment(ref counter) == 5) gate.Set();
else gate.WaitOne();
for (int i = 0; i < 1000; i++) sb.Append("a");
if (Interlocked.Decrement(ref counter) == 0) allDone.Set();
};
for(int i = 0 ; i < 5 ; i++)
{
new Thread(work).Start();
}
allDone.WaitOne();
Console.WriteLine(sb.Length);
最多3.5个'String.Builder'仍包含线程检查代码。有关更多详细信息,请参阅http://stackoverflow.com/a/3564934/3205。 – skolima 2012-10-18 15:42:53