程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#中Queue的線程安全問題

C#中Queue的線程安全問題

編輯:關於C#

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

下列示例說明如何同步 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),來達到這個目的。

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved