对这个问题的略微推测性质表示抱歉。
我正在使用内存中的静态对象编写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
}
}
...
}
如果执行或重建需要很长时间,并且可能会使用大量内存,那么堆栈写入的可能性很大,是否存在任何错误,特别是与并发相关的错误?
答案 0 :(得分:1)
如果有人使用Read
的公共getter或setter,您可能会遇到问题,因为那里没有同步。如果某人同时使用该属性,而另一个线程在Update
中修改它,则读取可能会获取过时值,或者写入所做的更改可能会无声地丢失。
该物业真的需要公开吗?公开可写?