C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
来源:互联网 发布:电子图书阅读软件 编辑:程序博客网 时间:2024/06/11 17:04
前述:
C#中支持多线程,而多线程引发的一个比较突出的问题就是在同一个时间里,可能会有多个线程访问同一个资源,引起资源的竞争
导致数据损坏。
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
很多时候,我们在使用Lock关键字,其锁住的不是多个线程里真正要竞争的资源,而是通过创建一个与竞争资源“随行”的锁对象,对它进行加锁,“随行”即这个锁对象在每次访问竞争资源时,都要先加锁它。
如:
static void Main(string[] args) { ls.Add(1); ls.Add(2); Thread td1 = new Thread(new ThreadStart(Test1)); td1.Start(); Thread td2 = new Thread(new ThreadStart(Test2)); td2.Start(); Console.ReadLine(); } private static object olock = new object();//随行的所对象 private static List<long> ls = new List<long>();//真正竞争的资源 private static void Test1() { lock (olock) { Console.WriteLine("方法1开始" + DateTime.Now.ToString()); Thread.Sleep(10000); ls.Add(1); Console.WriteLine("方法1结束" + DateTime.Now.ToString()); } } private static void Test2() { lock (olock) { Console.WriteLine("方法2开始" + DateTime.Now.ToString()); foreach (long i in ls) { Console.WriteLine(i); } Console.WriteLine("方法2结束" + DateTime.Now.ToString()); } }
上面代码中,两个线程真正竞争的资源是ls,两个方法里面都会访问ls,我却加一个随行的锁对象olock,在每次操作ls时,都对它进行加锁。
在使用lock关键字时,我突然想到“在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?”这问题,之后我用上面的测试代码验证了其结果。
在Test1()方法中,我把线程1先挂起10秒,来验证线程2运行的Test2()方法是否需要等待10秒才运行。
其结果显示:线程2的Test2()方法需要等待10秒才运行。
大家也可以试试,如果不加lock关键字,会出现什么结果?
- C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
- 同一个网页在不同的浏览器里面字体不一样?
- 在hibernate中同一个session里面有了两个相同标识但是是不同实体。
- 2.2.5一个对象不同的方法synchronized (this)是同一个对象锁
- 2.2.9同一个类的不同静态方法不同实例不同线程是同步的
- 同一个用户在不同页面共享数据的常用方法
- 两个带有线程池的方法分别执行两组线程任务,第二个方法需要等待第一组任务执行完毕
- thinkphp 在两个应用里面设置不同的session
- 在同一个textview里面设置一段文字 有不同的 颜色。
- Java中一个类里面有两个用synchronized修饰的非静态方法,不同的线程中的实例访问这两个方法时会发生什么?
- 线程的锁函数:threading.Lock() 返回锁对象 Lock
- 同一个菜单,在view和mainframe两个类里面添加响应函数的区别
- c#线程同步中的lock,monitor,同步事件和等待句柄以及mutex的介绍
- java中判断两个对象是否为同一个对象。
- C# 关于线程锁lock的使用方法
- 在线程里面出现异常需要处理UI的细节
- 利用java反射机制比较同一个bean的两个对象的值是否相同
- Android判断同一个类的两个对象的内容是否相同
- Ubuntu Linux 查看、编辑、比较二进制文件
- VS2005 VS2010数据断点不能设置的原因 new data breakpoint is disabled
- C#的GC,也就是垃圾回收机制
- cocos2d-x第一天:环境的搭建
- ARM存储器之:协处理器CP15
- C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
- opencv读取灰度图像像素代码
- MVC 音乐商店 第 6 部分: 使用数据批注模型验证
- GOOGle site多个网址
- CUDA: 64bit在Win7平台的搭建
- 如何下载videolectures的视频
- android 横竖屏 相关
- 如何向App Store提交应用
- Html之table_rowspan用法_colspan_实例