2011-08-24 20 views
9

Zacząłem czytać o komponencie bean sesji singleton i adnotacjach używanych do zarządzania współbieżnością zarządzaną kontenerami. Nie widzę tego w tym porównaniu w porównaniu do zwykłego słowa kluczowego "zsynchronizowanego", więc podejrzewam, że brakuje czegoś ważnego. Rozważmy następujący przykład z książki „Enterprise JavaBeans 3.1” przez Rubinger & Burke, O'Reilly:EJB 3.1 współbieżność zarządzana kontenerami kontra synchronizacja

@javax.ejb.Lock(javax.ejb.LockType.READ) 
public String concurrentReadOnlyMethod(){...} 

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

Jak to jest lepiej niż pomijając adnotacji wszystkich toghether w przypadku odczytu i za pomocą słowa kluczowego synchronized w przypadku odpisów , tak:

public String concurrentReadOnlyMethod(){...} 

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

Odpowiedz

4

Prosty.

"ConcurrentReadOnlyMethod" nie jest w ogóle zsynchronizowany, więc nie powoduje innych skutków ubocznych synchronizacji (takich jak wpływ na zmienne w modelu pamięci). Ponadto blokada READ zablokuje blokadę WRITE, więc po prostu zsynchronizowany, możesz mieć dwa wątki uruchamiające obie metody jednocześnie, natomiast z blokadą READ/WRITE nie.

Oczywiście jest więcej wartości, gdy masz kilka blokad READ i kilka blokad WRITE, ponieważ wszystkie blokady READ można współdzielić i uruchamiać jednocześnie, podczas gdy blokady WRITE działają bardziej jak zwykłe zsynchronizowane.

+1

Jeśli dobrze cię rozumiem, mogę to nieformalnie sformułować w następujący sposób: Biorąc pod uwagę jedną klasę zawierającą obie powyższe metody, w przypadku współbieżności zarządzanej przez kontenera semantyka to "równoczesne odczyty są dozwolone, dopóki nie trwa pisanie". Semantyka przeciwstawnego przykładu będzie następująca: "dozwolone są równoczesne odczyty, także podczas pisania trwa, ale tylko jeden wątek będzie pisać na raz". –

+0

Tak, to podsumowuje to całkiem dobrze. –

+0

Czy możesz mi podać odniesienie do tej semantyki blokady READ/WRITE w EJB 3.1? Nie mogłem go znaleźć nawet w specyfikacji. – illEatYourPuppies

2

Cóż, jak wspomniano przez Will, z synchronized nie można faktycznie replikować zachowanie javax.ejb.Lock adnotacji, ale rzeczywiście można to zrobić za pomocą ReadWriteLock zamki, ale jest to bardziej praca w końcu.

Na marginesie, ponieważ instancje pojedynczej instancji nie są współużytkowane w wielu maszynach JVM (co oznacza, że ​​nie są obiektami rozproszonymi), naprawdę nie ma innych korzyści, które mogą mi się przydać, aby Lock zapewniało dodatkową wygodę i łatwość użycia. wsparcie.

Należy również pamiętać, że "Jeśli ta adnotacja nie zostanie użyta, przyjęto wartość Zablokuj (WRITE)", więc nie można się jej naprawdę pozbyć.

Powiązane problemy