關於C#中Queue的線程安全問題


 

        若要保證 Queue 的線程安全,必須通過此包裝執行所有操作。

通過集合枚舉在本質上不是一個線程安全的過程。甚至在對集合進行同步處理時,其他線程仍可以修改該集合,這會導致枚舉數引發異常。若要在枚舉過程中保證線程安全,可以在整個枚舉過程中鎖定集合,或者捕捉由於其他線程進行的更改而引發的異常。

下列示例說明如何同步 Queue、如何確定 Queue 是否同步以及如何使用同步的 Queue。
[C#] 
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" );
   }
}
/* 
This code produces the following output.

myQ is not synchronized.
mySyncdQ is synchronized.
*/

          通過對比運行結果,可以明顯的看出通過Queue.Synchronized方法包裝的Queue被同步,沒有包裝的則沒有被同步。可以在實例化處這樣聲明,

// Creates a synchronized wrapper around the Queue.
      Queue mySyncdQ = Queue.Synchronized( new Queue());

這樣在多線程環境下可以使用Queue的同步對象鎖,來防止多線程同時對Queue進行寫操作。如果想讓其它線程不能訪問Queue對象,則可以使用lock(queue),來達到這個目的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM