Конкурентоспособная емкость контейнера EJB 3.1 и синхронизация

Я начал читать об одном синтаксическом сеансе и annotations, используемые для использования параллелизма, управляемого контейнером. Я не вижу преимущества этого по сравнению с простое использование «синхронизированного» ключевого слова, поэтому я подозреваю, что есть что-то важное, что мне не хватает. Рассмотрим этот пример из книги « Enterprise JavaBeans 3.1 » от Rubinger & Burke, O’Reilly:

@javax.ejb.Lock(javax.ejb.LockType.READ) public String concurrentReadOnlyMethod(){...} @javax.ejb.Lock(javax.ejb.LockType.WRITE) public void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

Как это лучше, чем исключить аннотацию все, что нужно для чтения, и использовать synchronized ключевое слово в файле записи, например:

 public String concurrentReadOnlyMethod(){...} public synchronized void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

Просто.

«ConcurrentReadOnlyMethod» вообще не синхронизирован, поэтому он не получает другого побочного эффекта синхронизации (например, воздействия на переменные в модели памяти). Кроме того, блокировка READ блокирует блокировку WRITE, поэтому при синхронизации вы можете одновременно использовать два streamа одновременно с обоими методами, тогда как с блокировкой READ / WRITE вы не будете.

Очевидно, что есть больше преимуществ, когда у вас есть несколько блокировок READ и несколько блокировок WRITE, так как все блокировки READ могут совместно использоваться и запускаться одновременно, в то время как блокировки WRITE действуют как обычный синхронизированный.

Ну, как уже упоминалось Уилл, с synchronized вы не можете реально воспроизвести поведение аннотаций javax.ejb.Lock , но на самом деле вы можете сделать это с помощью блокировок ReadWriteLock , но в конце концов это больше работает.

В качестве побочного примечания, поскольку экземпляры singleton не распространяются на несколько JVM (что означает, что они не являются распределенными объектами), нет никаких других преимуществ, о которых я могу думать, что Lock обеспечивает в стороне простоту использования и поддержку из коробки.

Также обратите внимание: «Если эта аннотация не используется, предполагается значение Lock (WRITE)», поэтому вы также не можете избавиться от него.