在.net中线程同步有一下几种方式:
1.lock语句
2.监视器
3.同步事件和等待句柄
4.Mutex对象
lock语句用于给对象获取互斥锁,执行操作语句,然后再释放该锁。在线程同步时,lock关键字将语句块标记为临界区,能保证代码顺利执行而不被其他线程中断,变量被包装在独占锁中。其他线程只能等待执行解锁之后才能访问改对象。如下
public static void Mian()
{
object o = new object();
lock(o)
{
//执行线程同步相关操作
}
}
其实上面的代买等价于:
public static void Mian()
{
object o = new object();
System.Threading.Monitor.Enter(o);
try
{
//执行线程同步相关操作
}
finally
{
system.Threading.Monitor.Exit(o);
}
}
lock 的规则:
1.lock的对象必须是引用类型参数。
2.避免锁定公共对象或不受应用程序控制的对象实例,最好是定义private对象来锁定。
3.String类型对象对多线程操作是安全的,因此不建议锁定字符串类型对象。
4.避免死锁。让两个线程以相同的枷锁顺序锁定对象,是避免死锁的有效手段。
5.Monitor类还提供了一个TryEnter的方法,使用更加灵活。可以有效的解决死锁的发生。
6.线程同步最好之应用在需要的时候,因为锁定对象对系统性能存在影响。一方面是枷锁与解锁的系统开销,另一方面可能导致其他线程因为等对释放对象而暂停执行。