1

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

4

1 回答 1

1

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

Collections.synchronizedSet(...);
于 2013-02-25T13:06:31.730 回答