我在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注释关心在集合上进行同步访问?

最佳答案

仅因为函数已同步并不意味着实际集合已同步。您无法保证connectedServices的其他内容即使在单例中也没有被修改。如果您确实需要同步收集,请使用:

Collections.synchronizedSet(...);

10-07 19:03