lock是C#中最常用的同步方式,格式为lock(objectA){codeB} 。
lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使用它至关重要:
1、objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。
2、 lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。
3、执行完codeB之后释放objectA,并且codeB可以被其他线程访问。
扩展资料:
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。如果确实存在此类引用,锁的范围将扩展到该对象。
严格地说,提供给 lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。
例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
不摆大理论,理论的大是大非自己去MSDN研读。
lock就是把{}中的代码段锁定,防止多个线程同时运行该代码段。
用法:
private void Do()
{
threat t1=new threat(doSomething);
threat t2=new threat(doSomething);
t1.Start();
t2.Start();
}
object locker=new object();
private void doSomething()
{
...........
.........
lock(locker)
{
FunLog() ;
}
........
}
比如说上面这样,当t1执行到lock时,检测发现locker不在锁定列表中,它会记录locker的内存地址,加入到锁定列表,并开始执行lock的锁定代码段;t2再执行到lock时,检测发现locker的内存地址是在锁定列表中的,于是线程等待;t1执行完FunLog到达lock结尾,将locker地址从锁定列表删除;t2检测发现locer已不在锁定列表中,它会记录locker的内存地址,加入到锁定列表,并进入执行lock的代码段。
lock主要用于处理并发问题、锁定独占对象。
锁住当前实例:lock(this)
锁住此类的所有实例:lock(typeof([Type]))
对字符串的锁,会锁定所有相同内容的字符串,建议可以用静态字符串代替
lock关键字比Monitor简洁,其实lock就是对Monitor的Enter和Exit的一个封装
lock是一种比较好用的简单的线程同步方式
public void Function()
{
object lockThis = new object();
lock (lockThis)
{
}
}
还可使用monitor,mutex,ReaderWriterLock
thisLock就是根据这个来锁,如果有线程在操作着{}里面内容,那么thisLock就会被占用,这时候有线程想访问,会排队等待,等前一个访问使用完成后再访问。
private Object thisLock = new Object();
lock (thisLock)
{
FunLog();
}
lock是baiC#中最常用的同步方式,格式为lock(objectA){codeB} 。
lock(objectA){codeB} 看似du简单,实际上有zhi三个意思,这对于适当地使用它至dao关重要:
1、objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。
2、 lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。
3、执行完codeB之后释放objectA,并且codeB可以被其他线程访问。
扩展资料:
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。如果确实存在此类引用,锁的范围将扩展到该对象。
严格地说,提供给 lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。
例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的