NLV*_*NLV 482 .net c# synchronization locking thread-safety
我看到,对于使用非线程安全的对象,我们用这样的锁包装代码:
private static readonly Object obj = new Object();
lock (obj)
{
// thread unsafe code
}
Run Code Online (Sandbox Code Playgroud)
那么当多个线程访问相同的代码时会发生什么(让我们假设它在ASP.NET Web应用程序中运行).他们排队了吗?如果是这样,他们会等多久?
使用锁会对性能产生什么影响?
Ste*_*ven 421
该lock
声明由C#3.0翻译为以下内容:
var temp = obj;
Monitor.Enter(temp);
try
{
// body
}
finally
{
Monitor.Exit(temp);
}
Run Code Online (Sandbox Code Playgroud)
在C#4.0中,这已经改变,现在生成如下:
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
// body
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以找到什么更多信息Monitor.Enter
确实在这里.引用MSDN:
使用
Enter
以获取作为参数传递的对象上的监视器.如果另一个线程已经Enter
对该对象执行了一个但尚未执行相应Exit
的线程,则当前线程将阻塞,直到另一个线程释放该对象.Enter
如果没有阻塞,同一个线程不止一次调用是合法的 ; 但是,Exit
在等待对象的其他线程将解除阻塞之前,必须调用相同数量的 调用.
该Monitor.Enter
方法将无限期等待; 它不会超时.
Uma*_*bas 257
它比你想象的简单.
据微软称:该lock
关键字确保一个线程不进入代码的关键部分而另一个线程处于关键部分.如果另一个线程试图输入锁定的代码,它将等待,阻止,直到该对象被释放.
该lock
关键字要求Enter
在该块的开始和Exit
在块的结尾.lock
关键字实际上处理Monitor
后端的类.
例如:
private static readonly Object obj = new Object();
lock (obj)
{
// critical section
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,首先线程进入临界区,然后它将锁定obj
.当另一个线程试图进入时,它也会尝试锁定obj
,这已被第一个线程锁定.我将不得不等待第一个线程发布obj
.当第一个线程离开时,另一个线程将锁定obj
并进入临界区.
Ars*_*yan 45
不,他们没有排队,他们正在睡觉
表单的锁定声明
lock (x) ...
Run Code Online (Sandbox Code Playgroud)
其中x是引用类型的表达式,恰好相当于
var temp = x;
System.Threading.Monitor.Enter(temp);
try { ... }
finally { System.Threading.Monitor.Exit(temp); }
Run Code Online (Sandbox Code Playgroud)
你只需知道他们正在等待对方,只有一个线程会进入锁定区域,其他线程将等待...
监视器完全写在.net中,所以它足够快,还可以查看 具有反射器的类监视器以获取更多详细信息
And*_*rew 27
锁将阻止其他线程执行锁定块中包含的代码.线程必须等到锁定块内的线程完成并释放锁定.这确实会对多线程环境中的性能产生负面影响.如果确实需要这样做,则应确保锁定块中的代码可以非常快速地处理.您应该尽量避免访问数据库等昂贵的活动.
Sim*_*ker 10
性能影响取决于您的锁定方式.您可以在此处找到一个很好的优化列表:http://www.thinkingparallel.com/2007/07/31/10-ways-to-reduce-lock-contention-in-threaded-programs/
基本上你应该尝试尽可能少地锁定,因为它会让你的等待代码进入睡眠状态.如果您在锁定中有一些繁重的计算或持久的代码(例如文件上载),则会导致巨大的性能损失.
归档时间: |
|
查看次数: |
300366 次 |
最近记录: |