1

Glassfish3.1.2.2にJavaEEアプリケーションがあります

そして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 に答える