Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让内存中的更改与后端保持同步的好方法是什么_Java_Design Patterns - Fatal编程技术网

Java 让内存中的更改与后端保持同步的好方法是什么

Java 让内存中的更改与后端保持同步的好方法是什么,java,design-patterns,Java,Design Patterns,在多用户情况下,保持对资源的更改与内存和持久存储同步的好方法是什么?这里有两个想法,但都很笨拙 候选人A 这里,必须检索r的副本,以便在put上同时更新内存状态和持久状态 Resource r = resources.getDeepCopyOfResourceById("foo"); r.removeValue("bar"); resources.put(r); 候选人B 这里,更新操作位于服务级别上。在我看来,这是一种面向对象的反模式 Resource r = resources.getRe

在多用户情况下,保持对资源的更改与内存和持久存储同步的好方法是什么?这里有两个想法,但都很笨拙

候选人A

这里,必须检索
r
的副本,以便在
put
上同时更新内存状态和持久状态

Resource r = resources.getDeepCopyOfResourceById("foo");
r.removeValue("bar");
resources.put(r);
候选人B

这里,更新操作位于服务级别上。在我看来,这是一种面向对象的反模式

Resource r = resources.getResourceById("foo");
resources.removeValue("foo", r);
有更好的设计方法吗

保持对资源的更改与两者同步的好方法是什么 多用户情况下的内存和持久存储

一般来说,这里有两个问题:缓存和并发

对于缓存,您需要决定使用什么策略。有很多选择。例如:

  • 通读/通读
  • 到处写
  • 写在后面
  • 缓存在一边

确定缓存模式后,下一步是使缓存和持久数据访问线程安全。这通常通过事务和锁来实现。具体的实现取决于您使用的库。

这是单线程的吗?后端的单个用户?如果不是,候选人A很活泼,会导致更新丢失。@MarkoTopolnik好问题:多用户。候选A可以使用
version
generation
属性来避免覆盖状态的较新版本。如果需要原子性,只需使用
资源即可。removeValue
是最佳方法。如果您认为这是一个漏洞百出的抽象,那么版本控制和生成只会让它变得更糟。