【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都会弹出框。
这就是锁与不锁的区别了。
【C#】【Thread】上下文同步域SynchronizationAttribute的更多相关文章
- 【C# 线程】ContextBoundObject类 --上下文绑定 和SynchronizationAttribute属性 、同步域
NET上下文的概念 应用程序域是进程中承载程序集的逻辑分区,在应用程序域当中,存在更细粒度的用于承载.NET对象的实体,上下文是用来确定对象的逻辑归属,那就.NET上下文Context.所有的.NET ...
- Thread 多线程 同步
当多个线程,访问同一个对象,调用同一个方法或访问同一个对象时.有时,必须保证访问的同步性.比如,一个银行信用卡账户具有5000元的信用额度.用户除具有一张主卡外,还办有多张子卡.这些卡的累计消费金额, ...
- Java Thread 多线程同步、锁、通信
参看:http://www.cnblogs.com/hoojo/archive/2011/05/05/2038101.html
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- C#高级编程笔记(11至16章)异步/托管/反射/异常
11.1.2LINQ语句 LINQ查询表达式以from子句开始,以select或者group子句结束.在这两个子句之间可以跟零个或者多个from.let.where.join或者orderby子句. ...
- c#语言-多线程中的锁系统(一)
介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. ...
- 强制TFS用户与计算机(域)用户同步
默认情况下,添加到域AD组中的账户不会立刻同步到TFS中. TFS每小时与域控制器同步一次,将计算机安全组中的账户添加到TFS中. 但是可以通过下面几种方式强制TFS立刻同步域中的账户: 1. 在TF ...
- async异步操作和同步上下文
第8章 哪个线程运行我的代码 看到社区里的朋友没有翻译完这本书,我接着对一下的章节进行翻译 像我之前说的,异步编程就是关于线程的.那就意味着我们需要理解在C#程序中哪个.NET线程什么时候运行我们的代 ...
- C#线程同步的几种方法
一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我. ...
随机推荐
- 使用NPOI将多张图片导入execl
protected void btn_Export_Click(object sender, EventArgs e) { List<BNXX_SJXJ_XJSJ> list = View ...
- 解决SwipeRefreshLayout左右滑动事件冲突的问题
在使用SwipeRefreshLayout时我们注意到在SwipeRefreshLayout中左右滑动时可能也会触发下拉刷新的事件,这点让我们很不爽.追其原因是SwipeRefreshLayout对于 ...
- 说说Python多线程中的daemon属性方法
大家看多线程部分的时候肯定看到过daemon这个属性,当我在百度了一圈后也没发现有比较好的解释(或者大家对这个解释都非常清楚),于是自己通过代码和官方介绍了解它,进行了一些总结 给大家一些参考. 首先 ...
- BeanFactory not initialized or already closed - call 'refresh' before accessing beans解决办法
今天在写Spring程序时遇到了一个很常见的错误,而我以前好像一直没碰到过,今天才见到这个错误,经过研究解决了这个错误,犯这个错误真是不应该啊. log4j:WARN No appenders cou ...
- iOS Xcode7上真机调试
在Xcode7上进行真机调试,不需要证书,步骤如下: 1. 2. 3. 4. 5.添加Apple ID后会显示两个Free,表示可以免费真机调试iOS应用和Mac应用,选中高亮选项,点击view de ...
- InfluxDB数据备份与恢复
数据备份与恢复 Example:(192.167.8.13 InfluxDB:DeviceHistory备份到192.167.8.52,然后恢复到该服务器上) steps: login 192 ...
- JQuery异步提交
JQuery提交部分 $.ajax({ url:'www.baidu.com', //提交的地址,相当于form的action type:'POST', //提交方式,相当于form的method d ...
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- mysql、sql server、oracle数据库分页查询及分析(操作手册)
1.mysql分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实 ...
- OpenStack虚拟机状态
OpenStack创建一个虚拟机,涉及到三种状态,vm_state,task_state和power_state. 先总结几点: 电源状态(power_state):是hypervisor的状态,从计 ...