内存事件溯源算法-它是正确的吗?是线程安全的吗?

本文关键字:溯源 事件 线程 安全 算法 内存 | 更新日期: 2023-09-27 18:11:06

很抱歉这个问题有点投机。

我正在写一个Cms使用内存中的静态对象来保持系统的当前状态,并使用事件源来创建一个事件日志,我可以用它来重建对象状态,并提供回滚等(见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
        }
    }
...
}

如果执行或重建需要很长时间,那么除了可能会有大量写操作堆积,并且可能会使用大量内存之外,这其中是否存在任何bug,特别是与并发相关的bug ?

内存事件溯源算法-它是正确的吗?是线程安全的吗?

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

这个属性真的需要是公共的吗?公开的可写?