静态类的奇怪行为

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班级是静态的吗?

Jon*_*Jon 6

是的,你这里有竞争条件; 不,这不是因为上课static.

的问题是,之间的LockedByReason1 = false和的读出Locker.Locked(这本身是远,从一个原子操作)其他线程可以执行代码,使在锁定条件为真.

通常,这种设计根本不提供对竞争条件的任何保护,因为它既不使用原子操作也不使用同步原语(例如lock语句).