• 【C#】【Thread】上下文同步域SynchronizationAttribute


      上下文同步:使用SynchronizationAttribute为ContextBoundObject对象创建一个简单的自动的同步。

      这种同步方式仅用于实例化的方法和域的同步。所有在同一个上下文域的对象共享同一个锁。

         //如果不加上下文,那么就是以对象为线程锁定区域,如果加上下文,那么就是以逻辑上下文为锁定区域    
        [Synchronization(SynchronizationAttribute.REQUIRED, true)] 
        class synchronizationClass : ContextBoundObject
        {
            public void Start()
            {
                MessageBox.Show(Thread.CurrentThread.Name);
            }
        }

    因为是使用SynchronizationAttribute来创建锁的,所以第一句[Synchronization(SynchronizationAttribute.REQUIRED, true)] 是必不可少的。

    又因为是为ContextBoundObject对象创建锁,所以对象必须是ContextBoundObject,故必须继承ContextBoundObject。

    两者缺一不可。

    测试:

           synchronizationClass myclass = new synchronizationClass();
           Thread thread = new Thread(new ThreadStart(myclass.Start));
           thread.Name = "thread1";
           Thread thread2 = new Thread(new ThreadStart(myclass.Start));
           thread2.Name = "thread2";
           thread.Start();
           thread2.Start();

    现象是thread1先弹框,点击确定后再弹thread2,原因就是整个对象都是一个锁,就是在thread1没处理完,thread2是无法进行操作的。

    所以呢,上下文同步域会将整一个上下文全部锁定,就是说整个类都成为了一个锁,在线程1未走出该类,线程2就无法进入该类。

    加入我把[Synchronization(SynchronizationAttribute.REQUIRED, true)]或者不继承ContextBoundObject发现此时的现象是thread1和thread2都会弹出框。

    这就是锁与不锁的区别了。

  • 相关阅读:
    8-4:Mysql数据库编程基础知识
    adb——Android的ADB工具使用
    BroadcastReceiver--Android广播机制
    怎样投篮更准
    《算法七》(深度寻路算法)
    《算法六》(有序二叉树)
    《算法五》(N叉树定义+增删改查)
    《算法四》(二分排序+汉诺塔问题)
    《算法三》(归并排序)
    《算法二》(希尔排序+基数排序+桶排序)
  • 原文地址:https://www.cnblogs.com/mqxs/p/4639197.html
Copyright © 2020-2023  润新知