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

本文介绍如何使用SynchronizationAttribute实现ContextBoundObject对象的上下文同步。通过实例化方法和域的同步,所有相同上下文域的对象共享同一把锁,确保线程安全。文中还通过示例演示了同步与非同步的区别。

  上下文同步:使用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都会弹出框。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值