toy*_*fun 0 c# static race-condition
我有一个可以被多种原因锁定的系统.
这是静态类,负责保持锁定状态:
internal static class Locker
{
private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
internal static bool LockedByReason1 { get; set; }
internal static bool LockedByReason2 { get; set; }
internal static bool LockedByReason3 { get; set; }
internal static bool Locked
{
get
{
log.DebugFormat("LockedByReason1: {0}, LockedByReason2: {1}, LockedByReason3: {2}", LockedByReason1, LockedByReason2, LockedByReason3);
return LockedByReason1 || LockedByReason2 || LockedByReason3;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是业务逻辑中的代码:
Locker.LockedByReason1 = false;
if (Locker.Locked)
log.Info("Unlocking system...");
else
log.Info("Not unlocking system");
Run Code Online (Sandbox Code Playgroud)
我的日志文件显示此文本:
2014-06-06 10:54:31,765 DEBUG Client.Utils.Locker - LockedByReason1: False, LockedByReason2: False, LockedByReason3: False
2014-06-06 10:54:31,765 INFO Client.BusinessLogicManager - Not unlocking system
Run Code Online (Sandbox Code Playgroud)
如您所见,同时调用LockedByReason1属性的设置和查询Locked状态.
我这里有竞争条件问题吗?
是因为Locker班级是静态的吗?
是的,你这里有竞争条件; 不,这不是因为上课static.
的问题是,之间的LockedByReason1 = false和的读出Locker.Locked(这本身是远,远从一个原子操作)其他线程可以执行代码,使在锁定条件为真.
通常,这种设计根本不提供对竞争条件的任何保护,因为它既不使用原子操作也不使用同步原语(例如lock语句).