Rozpocząłem dyskusję ze współpracownikiem na temat zarządzania współbieżnością w pojedynczych sesjach bean. Z mojego rozumienia, po przeczytaniu Oracle documentation, jeśli nie zostawisz adnotacji @ConcurrencyManagement
, domyślnie jest to współbieżność zarządzana przez kontener. W dokumentacji stwierdza następujące około kontenerów zarządzane singleton fasoli sesji:Zarządzanie równoczesnym dostępem w pojedynczej fasoli sesyjnej
The javax.ejb.Lock adnotacji i typ javax.ejb.LockType służą do określenia poziomu dostępu metod biznesowych Singleton lub @ Metody limitu czasu.
i
Jeśli nie @Lock adnotacja jest obecny na singleton klasy, domyślny typ blokady, @Lock (LockType.WRITE), stosuje się do wszystkich metod biznesowych i timeout.
Teraz, jeśli opisywanie fasoli z @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
, to jesteś odpowiedzialny za zapewnienie, że stan fasoli są synchronizowane na wszystkich klientów korzystających z synchronized
słowa kluczowego i innych standardowych funkcji współbieżności Java. W artykule mówi nawet:
programistów, którzy tworzą singletons z fasoli zarządzane współbieżności są dozwolone w użyciu języka programowania Java prymitywów synchronizacji, takich jak synchronizacja i lotny, aby uniknąć błędów podczas jednoczesnego dostępu.
nie widzę nigdzie w rozdziale dotyczącym pojemnika zarządzane współbieżności, prowadząc mnie do przypuszczenia, że jeśli chcesz synchronizować rzeczy samemu, trzeba opisywać klasę z @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
.
Mój współpracownik skomentował, mówiąc: "Człowieku, zróbcie coś dziwnego", kiedy zobaczył tę adnotację na mojej fasolce, która rozpoczęła tę dyskusję.
Żadna z jego fasoli nie ma adnotacji @ConcurrencyManagement
, ale używa słowa kluczowego synchronized
w całej klasie. Czy mam rację, mówiąc, że jakakolwiek precyzyjniejsza synchronizacja, której używa, jest bez sensu, ponieważ wszystkie jego metody biznesowe mają domyślną adnotację @Lock(LockType.WRITE)
? Oznaczałoby to, że jeśli klient wywoła jedną ze swoich metod, żaden inny klient nie może wywołać żadnej metody komponentu bean, więc jawna synchronizacja w metodzie byłaby bezużyteczna.
Na przykład dla pewnej blokady myLock
używanej w synchronized (myLock)
w ramach jednej z jego metod biznesowych, nie byłoby rywalizacji o tę blokadę, ponieważ metody te są skutecznie synchronizowane same.
Popraw mnie jeśli się mylę, ale wydaje się, że jego metody zasadzie wyglądać następująco:
public synchronized void myMethod() {
// do stuff
synchronized (lock) {
// modify mutable state
}
}
public synchronized void myOtherMethod() {
// do other stuff
synchronized (lock) {
// modify mutable state
}
}
Zakładając, że lock
jest tworzony w tej sesji singleton fasoli tylko chronić stan zmienny w fasoli, to wydaje się, że nie służy to żadnym celom w przypadku współbieżności zarządzanej przez kontener.
Z góry dziękujemy za wszelkie informacje na ten temat!
Nie wierzę, że to istnieje w naszym projekcie. Powtarzał: "Robię to od lat i działa dobrze", ale wydawało się, że nie rozumie, co mówię. Byłoby dobrze, ale zakładając, że to, co czytam, jest poprawne, jego "zsynchronizowane" bloki byłyby po prostu niepotrzebne i nie zwiększałyby przepustowości. –
Mam również ochotę przetestować jego kod i sprawdzić, czy jego synchronizacja rzeczywiście coś robi, ale mam zbyt wiele do zrobienia ... może kiedy dostanę trochę wolnego czasu :) –