如何在隐藏诽谤地图时阻止阅读

时间:2016-06-23 06:03:22

标签: hazelcast

因为有很多数据应该放入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);
        }

    }
};

```

2 个答案:

答案 0 :(得分:0)

你的动机/用例是什么?您可以使用事务,但这可能会对性能产生不良影响。或者,您可以使用手动锁定 - 请参阅ILock

然而,当您没有机会以不同的方式设计应用程序时,这两种技术都应该用作最后的手段。

答案 1 :(得分:0)

实现此目的的一种方法是在添加时将Map中的段锁定在Map b中。一旦将条目推送到Map a完成,您就可以解锁这些段 这种方法会对性能产生影响,因为它需要一个额外的锁定/解锁步骤。