2013-06-04 13 views
5

Próbuję zastosować lekcje z czytania Java Concurrency In Practice w odniesieniu do deklarowania, czy klasy, które piszę, są albo bezpieczne dla wątków, albo zawierają niezsynchronizowany stan zmienny. Myślę, że to dobry pomysł, ponieważ dokumentuje zamiar wykorzystania klasy.Czy istnieje lista klas bezpiecznych dla wątków w języku Java?

Dzisiaj napisałem klasę, która opakowuje instancję java.lang.Class i java.net.URI. Miałem właśnie napisać w javadocie, że jest niezmienny, ponieważ oba pola zostały zadeklarowane jako końcowe odniesienia. Jednak przyjrzałem się kodowi źródłowemu URI i klasy i nie widziałem deklaracji, czy są bezpieczne dla wątków, i nie wydawało się to od razu oczywiste.

Myślenie o tym bardziej ogólnie: czy istnieje lista typowych klas java określających, czy są one bezpieczne dla wątków czy nie?

Z drugiej strony, prawdopodobnie nie ma znaczenia, czy przypadki są ściśle wątkowe ze względu na sposób, w jaki ta klasa jest używana, oznaczę to jako "prawdopodobnie wątek bezpieczny" na teraz.

+0

Istnieje kilka znanych klas gwint-niebezpieczne, takie jak SimpleDateFormat na przykład, ale nie sądzę, istnieje wyczerpująca, oficjalna lista. Więc jeśli klasa nie jest udokumentowana jako bezpieczna lub możesz udowodnić z przekonaniem, że jest i pozostanie * bezpieczna w przewidywalnej przyszłości, prawdopodobnie powinieneś pomyśleć o ostrożnej stronie ... – assylias

Odpowiedz

6

Nie ma definitywnej listy klas bezpiecznych dla wątków w języku Java. Jedynymi osobami, które uzyskałyby może być, tworząc ostateczną listę , to Oracle , a tego nie zrobiły.


1 - Oracle jest kustosz obu bibliotek klas Java odniesienia (w tym Javadocs), inne „oficjalnej” dokumentacji i .. oficjalny zestaw testów zgodności dla Java. Są to ludzie, którzy powiedzieliby, czy klasa (lub podzbiór klasy), która jest bezpieczna dla wątków, jest bezpieczna dla wątków według projektu, czy też jest to artefakt implementacji. Nikt inny nie może zrobić tego callla z całkowitą pewnością; tzn czy klasa, która jest thread-safe w standardowym kodzie Oracle powinien być także bezpieczny wątku w żniwa/kodzie Android lub kodzie Classpath, albo ...

5

Zakłada się, że wszystkie niezmienne klasy są zabezpieczone wątkiem. W przypadku klas zmiennych powszechną praktyką jest jawne stwierdzenie, kiedy klasa jest bezpieczna dla wątków; jeśli nic nie zostanie powiedziane, nie można zakładać bezpieczeństwa gwintu.

Nigdy nie słyszałem o liście z wątków klasy JDK wątku.

+0

+1 być ostrzeżonym, że podczas gdy niektóre klasy są uważane za bezpieczne dla wątków, nie oznacza to, że możesz ich używać w dowolny sposób i nadal bezpiecznie. na przykład nie możesz iterować w Vector bez jawnego blokowania go. –

+0

Nie można też bezpiecznie udostępniać ich w wyścigu danych. –

5

wszystkich klasach java.lang (Jak powiedział Marko zakłada zajęcia niezmienne być bezpiecznym dla wątków). Również BigDecimal i BigInteger i kilka innych. Niestety nie ma listy tych zajęć.

Jeśli potrzebujesz niektóre kolekcje wątku bezpieczny spróbować Google guawy niezmienne Kolekcje (http://code.google.com/p/guava-libraries/wiki/GuavaExplained?tm=6)

Powiązane problemy