• 关于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),来达到这个目的。

  • 相关阅读:
    Canvas 绘画
    h5内容初探
    border&background1
    css3选择器补充
    bootstrap
    css3文本和颜色
    css3边框与背景
    css3选择器
    jQuery之dom操作(取赋值方法)
    push.default
  • 原文地址:https://www.cnblogs.com/fire909090/p/8029101.html
Copyright © 2020-2023  润新知