絕對沒有;這裏是一個簡單的例子,從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