concurrency gerenciada por contêiner EJB 3.1 vs. sincronizada

Comecei a ler sobre o bean de session singleton e as annotations usadas para empregar a simultaneidade gerenciada por contêiner. Eu não vejo o benefício disso comparado a simplesmente usar a palavra-chave ‘sincronizada’, então suspeito que há algo importante que estou perdendo. Considere este exemplo do livro ” Enterprise JavaBeans 3.1 ” de 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){...} 

Como isso é melhor do que omitir a anotação em conjunto no caso de leitura e usar a palavra synchronized chave synchronized no write-case, assim:

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

Simples.

O “concurrentReadOnlyMethod” não está sincronizado, portanto, ele não ganha outro efeito colateral de synchronization (como efeitos em variables ​​dentro do modelo de memory). Além disso, o bloqueio READ bloqueia o bloqueio WRITE, portanto, com apenas sincronizado, você pode ter dois threads executando ambos os methods simultaneamente, enquanto que com o bloqueio READ / WRITE você não o fará.

Obviamente, há mais valor quando você tem vários bloqueios READ e alguns bloqueios WRITE, pois todos os bloqueios READ podem ser compartilhados e executados simultaneamente, enquanto os bloqueios WRITE agem mais como um normal sincronizado.

Bem, como mencionado por Will, com o synchronized você não pode realmente replicar o comportamento das annotations javax.ejb.Lock , mas você pode realmente fazer isso usando os bloqueios ReadWriteLock , mas isso é mais trabalho no final.

Como uma nota lateral, como as instâncias singleton não são compartilhadas em várias JVMs (o que significa que elas não são objects distribuídos), realmente não há outros benefícios que eu possa pensar que o Lock forneça, além da facilidade de uso e do suporte pronto para uso.

Por favor note também que “Se esta anotação não for usada, um valor de Lock (WRITE) é assumido”, então você também não pode se livrar dela.