【发布时间】:2011-05-14 06:34:51
【问题描述】:
在 try 块中使用 lock 有什么问题吗?我记得在某处读到,我们应该始终尝试将最少数量的代码放在 try 块中,并在内部锁定自身使用 try-finally 块,你们看到这里有什么问题吗?我需要处理一个事实,即该锁中的代码块可以抛出异常
try
{
lock(syncblk)
{
// do some processing
}
}
catch(Exception e)
{
// do something with exception
}
【问题讨论】:
-
你所做的是正确的。
lock语句确保在块结束时释放锁,即使抛出异常也是如此。 -
@Jim:你说这是件好事。 这是一件坏事。如果抛出了意外的异常,那么释放锁可以防止死锁,当然,但它也解锁了对现在已损坏以致导致异常的状态的访问!
-
@Jim:如果您正在考虑的只是代码完成时锁是否解锁出于任何原因,那么他所做的是正确的。对于某人来说,这本身可能是一个目标,但这并不是编写好软件的好方法。
-
@Eric:点了。看来我救了树,让森林烧了。
-
@Eric:使用锁的三个原因:(1)防止其他线程在不满足其不变量时看到该对象,(2)防止其他线程将对象进入与锁定线程期望的状态不一致的状态,或 (3) 避免以由于原因 #2 获取它的线程可能不期望的方式更改项目。如果由于原因#2 或#3 获取锁的代码抛出异常,则释放锁没有任何问题。我会进一步建议,如果#1是一个问题,适当的补救措施是......
标签: c# exception-handling synchronization