2013-02-25 2 views
1

У меня есть приложение Java EE на Glassfish 3.1.2.2ConcurrentModificationException хотя @Lock (LockType.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 блокирует синхронизированный доступ на множестве?

+0

Не могли бы вы показать трассировку стека исключения ConcurrentModificationException? А что такое пакет Lock? – gogognome

+0

спасибо, я поменю HashMap на Collections.synchronizedSet (..). Без блокировки Glassfish. – DSmelanskij

+0

Ваш текущий способ дает большую пропускную способность в случае шаблона доступа, доступного для чтения. Я бы поработал над этим немного больше, если бы был вами :) –

ответ

1

Просто потому, что функция синхронизирована, не означает, что фактическая коллекция синхронизирована. Вы не можете гарантировать, что что-то еще не изменило connectedServices, даже если оно находится в одноэлементном режиме. Если вам действительно нужна синхронизированная коллекция, используйте:

Collections.synchronizedSet(...); 
+0

Это частная коллекция, поэтому гарантия есть. –

+0

hm ok, я подумал, что Glassfish делает чудо, и он работает без синхронизацииSet :) Спасибо! – DSmelanskij

+0

@MarkoTopolnik не очень, вы можете использовать отражение и частное исчезает. Конечно, это педантично относительно отражения :) – Woot4Moo

Смежные вопросы