【发布时间】:2013-06-19 04:22:06
【问题描述】:
我正在尝试在我的应用程序中使用 Hazelcast 实现分布式缓存。我正在使用 Hazelcast 的 IMap。我遇到的问题是每次从地图中获取值并更新值时,我都需要再次执行put(key, value)。如果我的值对象有 10 个属性并且我必须更新所有 10 个属性,那么我必须调用 put(key, value) 10 次。类似的东西 -
IMap<Integer, Employee> mapEmployees = hz.getMap("employees");
Employee emp1 = mapEmployees.get(100);
emp1.setAge(30);
mapEmployees.put(100, emp1);
emp1.setSex(“F”);
mapEmployees.put(100, emp1);
emp1.setSalary(5000);
mapEmployees.put(100, emp1);
如果我不这样做,对同一个 Employee 对象进行操作的其他节点将更新它,最终结果是该员工对象不同步。有什么解决方案可以避免多次明确调用 put 吗?在ConcurrentHashMap 中,我不需要这样做,因为如果我更改对象,地图也会更新。
【问题讨论】:
-
Hazelcast 为您提供对象的克隆(因为它以二进制/序列化的形式存储在集群中)。要使更新对其他节点/线程可见,您应该将其放回原处。此外,如果您的 Employee 类不是线程安全的,那么 JDK ConcurrentHashMap 不能保证更新对其他线程的可见性(有时即使您将其放回地图)。因此,无论哪种情况,您都应该使用同步机制。