因为有很多数据应该放入hazelcast地图中,我想在数据放入地图时阻止他人阅读。
有没有办法实现它?
例如:
map a = map(1,000,000,000) // a has 1,000,000,000 elements
map b = map(2,000) // b has 200 emlemnts
我想把所有的b都放进一个;
在将所有这些元素放入map a;
之后,应该访问b的元素如果地图b的元素尚未完全放入地图中,则无法访问地图b的元素。
map a ={1,2,3,4,5}
map b ={a,b,c,d,e}
打印//结果{1,2,3,4,5}
foreach item in b
a.put item
打印// 结果{1,2,3,4,5}
end foreach
打印//结果{1,2,3,4,5,a,b,c,d,e}
我想合并这两张地图。而在合并完成之前,无法通过地图a访问地图b的元素。
感谢所有人的帮助。 在阅读了hazelcast手册之后,我选择了transactionalMap来解决这个问题。
transactionalMap是READ_COMMITED islate。当事务更新map(1)时,它可以暂停读取map(1)线程。
```java static Runnable tx = new Runnable(){ @覆盖 public void run(){
try {
logger.info("start transaction...");
TransactionContext txCxt = hz.newTransactionContext();
txCxt.beginTransaction();
TransactionalMap<Object, Object> map = txCxt.getMap("map");
try {
logger.info("before put map(1)");
Thread.sleep(300);
map.put("1", "1"); // reader1 is blocked
logger.info("after put map(1)");
Thread.sleep(500);
map.put("2", "2"); // reader2 is blocked
logger.info("after put map(2)");
Thread.sleep(500);
txCxt.commitTransaction();
logger.info("transaction committed");
} catch (RuntimeException t) {
txCxt.rollbackTransaction();
throw t;
}
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
logger.info("Finished testmap size:{}, testmap(1):{}, testmap(2):{} ", testmap.size(), testmap.get("1"),
testmap.get("2"));
Hazelcast.shutdownAll();
logger.info("system exit.");
System.exit(0);
}
}
};
```
答案 0 :(得分:0)
你的动机/用例是什么?您可以使用事务,但这可能会对性能产生不良影响。或者,您可以使用手动锁定 - 请参阅ILock
。
然而,当您没有机会以不同的方式设计应用程序时,这两种技术都应该用作最后的手段。
答案 1 :(得分:0)
实现此目的的一种方法是在添加时将Map中的段锁定在Map b中。一旦将条目推送到Map a完成,您就可以解锁这些段 这种方法会对性能产生影响,因为它需要一个额外的锁定/解锁步骤。