- 在一个应用程序中使用多线程
- 好处是每一个线程异步地执行.
- 对于Winform程序,可以在后台执行耗时操作的同时,保持前台UI正常地响应用户操作.
- 对于Service.对于客户端的每一个请求,可以使用一个单独的线程来进行处理.而不是等到前一个用户的请求被完全处理完毕后,才能接着处理下一个用户的请求.
- 同时,异步带来的问题是,必须协调对资源(文件,网络,磁盘)的访问.
- 否则,会造成在同一时间两个以上的线程访问同一资源,并且这些线程间相互未知,导致不可预测的数据问题.
- 好处是每一个线程异步地执行.
- Lock/Monitor:防止线程敏感的代码块被并行执行.
- Lock/SyncLock语句块
- 保证一个代码块完整的执行期间,不会受到其他线程的中断影响.直到执行完成.
- 方式:在代码块的存续期间内,获得一个给定对象的互斥锁定.
- 参数必须是引用类型.
- 用来定义锁定的范围.
- 参数对象是用来唯一确定要在多个线程间共享的资源,所以,可以是任何的对象实例.
- 但是,一般使用多线程需要同步的资源对象.
- 传递值类型会进行装箱.
- 最佳实践:尽量避免lock共有类型,或者超出被同步代码控制的对象实例.
- Lock(this).其它代码块可能也会Lock该公用实例,容易导致多个线程互相等待相同对象的锁定的释放,从而造成死锁.
- Lock(Typeof(publicType)).锁定共有类型,也会造成相同的问题.
- Lock("myStr").字符串驻留在CLR中,整个应用程序中,对于同一字符串,只有一个实例.所以,锁住一个字符串,会导致在所有的线程中,导致对该字符串的锁定.
- 所以,应该Lock私有/受保护的成员.
- 一些Class还提供了一些专门用以锁定的成员.Array类和其它很多的集合类型都提供了SyncRoot.
- Monitor
- 功能上与Lock语句是等效的
- 锁定范围不应该跨越多个方法.
-
View Code
1 lock (x) 2 { 3 DoSomething(); 4 } 5 6 //the same. 7 8 try 9 { 10 DoSomething(); 11 } 12 finally 13 { 14 System.Threading.Monitor.Exit(obj); 15 }
- 功能上与Lock语句是等效的
相关文章: