四互斥锁
有时候我们不得不面对线程不安全的问题比如说在一开始提出来的那个例子多线程完成次任务我们怎样才能解决这个问题一个简单的办法就是给共享资源加上互斥锁在C#中这很简单比如一开始的那个例子
public static class Environment{public static int count = ;//全局计数器
}
//…void ThreadMethod()//运行在每个线程的方法
{
while( true )
{
lock ( typeof( Environment ) )
{
if ( count >= )//如果达到任务指标
break;//中断线程执行
DoSomething();//完成某个任务
count++;}}}
通过互斥锁使得一个线程在使用count字段的时候其他所有的线程都无法使用而被阻塞等待达到了避免线程沖突的效果
当然这样的锁会使得这个多线程程序退化成同时只有一个线程在跑所以我们可以把count++提前使得lock的范围缩小如这样
void ThreadMethod()//运行在每个线程的方法{
while( true )
{
lock ( typeof( Environment ) )
{
if ( count++ >= )//如果达到任务指标
break;//中断线程执行
}
DoSomething();//完成某个任务
}}
最后来聊聊SyncRoot的问题
用NET的一定会有很多朋友困惑为什么对一个容器加锁需要这样写
lock( Container
SyncRoot )
而不是直接lock( Container )
因为锁定一个容器并不能保证不会对这个容器进行修改考虑这样一个容器
public class Collection{
private ArrayList _list;
public Add( object item )
{
_listAdd( item );
}
public object this[ int index ]
{
get { return _list[index]; }set { _list[index] = value;}
}}
看起来将其lock起来后就万事大吉了没有人能修改这个容器但实际上这个容器不过是用一个ArrayList实例来实现的如果某段代码绕过这个容器而直接操作_list的话则对这个容器对象lock也不可能保证容器不被修改了
[] [] []