内存中事件源算法 - 是不是?它是线程安全的吗?

时间:2011-10-13 18:04:01

标签: c# thread-safety event-sourcing

对这个问题的略微推测性质表示抱歉。

我正在使用内存中的静态对象编写Cms来保存系统的当前状态,并使用Event Sourcing创建一个事件日志,我可以使用它来重建对象状态,并提供回滚等(如果您不知道我在做什么,请参阅http://martinfowler.com/articles/lmax.html

public class Cms
{
    private static object WriteLock = new object();
    public static Cms Read { get; set; }
    static Cms Write { get; set; }

    static Cms()
    {
        Read = RebuildFromActionLog();
        Write = RebuildFromActionLog();
    }

    public static void Update(Action action)
    {

        lock (WriteLock)
        {                
            try
            {
                action.Apply(Write);
            }
            catch(Exception ex)
            {
                Write = RebuildFromActionLog(); //ditch the potentially messed up Write model
                throw;
            }
            LogAction(action); //the action was a keeper, so keep it
            Read = Write; //ditch the current read only model - it will continue to be used by any requests that have grabbed it
            Write = RebuildFromActionLog(); //get a new model ready for the next write
        }
    }
...
}

如果执行或重建需要很长时间,并且可能会使用大量内存,那么堆栈写入的可能性很大,是否存在任何错误,特别是与并发相关的错误?

1 个答案:

答案 0 :(得分:1)

如果有人使用Read的公共getter或setter,您可能会遇到问题,因为那里没有同步。如果某人同时使用该属性,而另一个线程在Update中修改它,则读取可能会获取过时值,或者写入所做的更改可能会无声地丢失。

该物业真的需要公开吗?公开可写