通過集合枚舉在本質上不是一個線程安全的過程。甚至在對集合進行同步處理時,其他線程仍可以修改該集合,這會導致枚舉數引發異常。若要在枚舉過程中保證線程安全,可以在整個枚舉過程中鎖定集合,或者捕捉由於其他線程進行的更改而引發的異常。
下列示例說明如何同步 Queue、如何確定 Queue 是否同步以及如何使用同步的 Queue。Unity3D教程手冊
using System; using System.Collections; public class SamplesQueue { public static void Main() { // Creates and initializes a new Queue. Queue myQ = new Queue(); myQ.Enqueue( “The” ); myQ.Enqueue( “quick” ); myQ.Enqueue( “brown” ); myQ.Enqueue( “fox” ); // Creates a synchronized wrapper around the Queue. Queue mySyncdQ = Queue.Synchronized( myQ ); // Displays the sychronization status of both Queues. Console.WriteLine( “myQ is {0}.”, myQ.IsSynchronized ? “synchronized” : “not synchronized” ); Console.WriteLine( “mySyncdQ is {0}.”, mySyncdQ.IsSynchronized ? “synchronized” : “not synchronized” ); } }
通過對比運行結果,可以明顯的看出通過Queue.Synchronized方法包裝的Queue被同步,沒有包裝的則沒有被同步。可以在實例化處這樣聲明,
// Creates a synchronized wrapper around the Queue. nbsp; Queue mySyncdQ = Queue.Synchronized( new Queue());
這樣在多線程環境下可以使用Queue的同步對象鎖,來防止多線程同時對Queue進行寫操作。如果想讓其它線程不能訪問Queue對象,則可以使用lock(queue),來達到這個目的。
查看本欄目