2011-07-19 16 views

Odpowiedz

1

Actualy nie. Zobacz dowód kodu źródłowego. Co najmniej TransactionTemplate ma nie ostatniego użytkownika transactionManager, który może być niewidoczny dla już utworzonych wątków. Co więcej, wyprowadza wszystkie niepowiązane i publicznie modyfikowane elementy z DefaultTransactionDefinition.

W rzeczywistości dynamiczne pojemniki (np. OSGI) pod obciążeniem można uzyskać NPE na korzystanie z menedżera transakcji wewnątrz TransactionTemplate. Specjalnie, jeśli utworzysz sam TransactionTemplate (nie w kontekście Spring). Dzieje się tak, ponieważ działające wątki (na przykład procesory żądań internetowych) są już utworzone i ciepłe (mają własną pamięć podręczną CPU związaną z wątkami). Po utworzeniu nowej TransactionTemplate w wątku init nie jest wykonywana żadna bariera pamięci, aby opróżnić pamięć podręczną powiązaną z wątkiem (lub rdzeniem CPU). W bardzo rzadkich przypadkach członkowie nowoutworzonych TransactionTemplate mogą nie być widoczni dla "starych" wątków.

Jesteśmy hitem analogii (niezupełnie z TransactionTemplate, ale z RetryTemplate) błąd w produkcji po gorącej aktualizacji działającego serwisu WWW. Trzeba powiedzieć, że nie widzimy takiego błędu w przypadku instancji utworzonych w Spring Context, może to być spowodowane globalną synchronizacją przeprowadzoną przy inicjalizacji kontekstu.

Prawie wszystkie klasy szablonów Spring są zmienne i nie ma jawnej synchronizacji wewnątrz. Dlaczego dokumentacja mówi, że jest to wątek, którego nie rozumiem.

Możesz częściowo się zabezpieczyć, tworząc końcowe pole we własnej klasie, które zawiera odwołanie do * Szablonu z powodu tej instrukcji w JMM (patrz dołączony link): "Ponadto widoczne wartości dla dowolnego innego obiektu lub tablicy te ostatnie pola będą co najmniej tak aktualne, jak ostatnie pola. "

W takim przypadku, jeśli nie zmieniasz stanu instancji * Template, jest to "bezpieczne dla wątków". Nie według projektu samego w sobie, ale według konkretnego zastosowania i właściwości JMM.

Zobacz that question i java memory model on final.

Powiązane problemy