ConcurrentModificationException虽然是@Lock(LockType.READ)注释

时间:2013-02-25 13:01:13

标签: java java-ee concurrency glassfish

我在Glassfish 3.1.2.2上有Java EE应用程序

并通过read()我在下面的代码中得到一个ConcurrentModificationException:

private Set<MonitoredService> connectedServices = new HashSet<MonitoredService>();

@Override @Lock(LockType.WRITE)
public void addConnectedService(MonitoredService service) {
    if (!connectedServices.contains(service)) {
        connectedServices.add(service);
    }
}

@Override  @Lock(LockType.READ)
public Set<MonitoredService> getConnectedServices() {
    return  Collections.unmodifiableSet(new HashSet<MonitoredService>(connectedServices));
}

我认为Lock注释关注集合上的同步访问?

1 个答案:

答案 0 :(得分:1)

仅仅因为函数同步并不意味着实际的集合是同步的。你无法保证其他东西没有被修改connectedServices,即使它在单身内也是如此。如果您真的需要同步集合,请使用:

Collections.synchronizedSet(...);