如果我要遍历客户端A上的列表,并且客户端B同时删除同一列表中的一项。客户A是否会遇到ConcurrentModifyException
?
或者,由于Ilist
是“写时复制”,客户A是否可以访问已删除的项目?
答案 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)
时会获得实际的前项。