如标题所述,我有这种情况
lock ( _myLockObj )
{
// protected section here ( select + update over SQL Tables)
}
这很好用,但有时我不需要线程安全,因为数据保证不会发生任何错误(即使两个线程在parralel中运行)但我需要速度。 目前,程序可以理解线程何时可能存在线程安全问题,何时不能(当我不需要尽可能快时)。
我将实现的是对该锁定指令的选择性,只有在适当的条件下才会生效。
例如:
lock ( _myLockObj ) && flag
我很确定lock关键字不提供语义,我理解的是实现该行为的正确方法是什么。
答案 0 :(得分:3)
try/finally
语句是bool flag = false;
bool acquiredLock = false;
try
{
if (flag)
{
Monitor.Enter(_myLockObj, ref acquiredLock);
}
}
finally
{
if (flag & acquiredLock)
{
Monitor.Exit(_myLockObj);
}
}
块中Monitor.Enter
+ Monitor.Exit
的语法糖。
您可以直接使用这些方法:
.on
答案 1 :(得分:0)
我个人认为以下更好:
private bool flag;
public T DoStuff() {
T DoStuffUnsafe() {
// ...
}
if (flag) {
lock (_myLockObj) {
return DoStuffUnsafe();
}
}
else {
return DoStuffUnsafe();
}
}