hazelcast IList是copyonwrite吗?

时间:2019-03-20 03:54:23

标签: hazelcast

如果我要遍历客户端A上的列表,并且客户端B同时删除同一列表中的一项。客户A是否会遇到ConcurrentModifyException? 或者,由于Ilist是“写时复制”,客户A是否可以访问已删除的项目?

1 个答案:

答案 0 :(得分:0)

Hazelcast IList 的行为类似于并发安全列表。没有写时复制行为或修改例外。

每个 IList 存储在群集中的一台服务器上。

当客户端A执行hazelcast.getList("name")时,它将获得对服务器上该列表的代理引用。客户端B执行hazelcast.getList("name")时,它将获得对同一列表对象的另一个代理引用。

如果客户A进行了list.remove(0),则会从 服务器列表。如果客户B随后进行了list.get(0),它将不会得到该项目

尝试一下

    public static void main(String[] args) throws Exception {
        HazelcastInstance server = Hazelcast.newHazelcastInstance();

        IList<String> iList_0 = server.getList("something");
        iList_0.add("one");
        iList_0.add("two");
        iList_0.add("three");
        iList_0.add("four");
        iList_0.add("five");

        HazelcastInstance client_1 = HazelcastClient.newHazelcastClient();
        HazelcastInstance client_2 = HazelcastClient.newHazelcastClient();

        IList<String> iList_1 = client_1.getList("something");
        IList<String> iList_2 = client_2.getList("something");

        Iterator<String> iterator = iList_1.iterator();

        while (iterator.hasNext()) {
            System.out.println("size()==" + iList_1.size() + ",hasNext()==" + iterator.hasNext());
            System.out.println("remove(0)==" + iList_2.remove(0));
            TimeUnit.SECONDS.sleep(5);
            System.out.println("next()==" + iterator.next());
            if (iList_1.size() > 0) {
                System.out.println("get(0)==" + iList_1.get(0));
            }
        }

        client_2.shutdown();
        client_1.shutdown();
        server.shutdown();
    }

客户端1在获得迭代器时遍历列表。客户端2可以删除项目,而不会影响迭代器。客户端1执行get(0)时会获得实际的前项。