内存事件溯源算法-它是正确的吗?是线程安全的吗?
本文关键字:溯源 事件 线程 安全 算法 内存 | 更新日期: 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
中修改了它,那么读可能会获取一个过时的值,或者通过写所做的更改可能会无声地丢失。
这个属性真的需要是公共的吗?公开的可写?