Nie jestem pewien, czy zmienne słowo kluczowe powinno być również używane dla nie-prymitywów. Mam element klasy, który jest ustawiony/przypisany przez jeden wątek i dostęp do innego wątku. Czy powinienem zadeklarować, że ten członek jest niestabilny?java - słowo kluczowe volatile również dla nie-prymitywów
private /* volatile */ Object o;
public void setMember(Object o) {
this.o = o;
}
public Object getMember() {
return o;
}
Tutaj setMember (...) jest wywoływany przez jeden wątek, a getMember() jest wywoływany przez inny.
Jeśli na przykład był to boolean, odpowiedź brzmiałaby tak.
Używam Java 1.4, a członek w tym przypadku jest tylko do odczytu. Dlatego dbam tylko o widoczność w tym przypadku, stąd moje pytanie dotyczące zmiennego słowa kluczowego.
Tylko ciekaw tego oświadczenia - członków obiektu pole dotyczy muszą być również przeznaczone do wielowątkowych dostępu - byłoby wspaniale, gdyby można poszerzyć, dlaczego tak jest? – jtkSource
@jtkSource: volatile dotyczy tylko pola, ale pole zawiera tylko odwołanie. Tak zmienna zapewnia, że inne wątki widzą aktualizacje tego odniesienia, ale jeśli wskazany obiekt nie używa poprawnie lotnej lub synchronizującej poprawnie, to inne wątki mogą nie widzieć aktualizacji pól tego obiektu. –
po prostu myślenie - więc czy zmienna lotna odnosi się do obiektu, czy zmienne nielotne również nie będą "widzialne" w spójny sposób w kontekście obiektu, który zadeklarował, że jest niestabilny? Jeśli istnieją inne obiekty, które również odnoszą się do tego "odnoszącego się do obiektu" w sposób nieulotny, czy tylko te obiekty mogą nie widzieć zmiennej w stanie zgodnym? czy jest szansa, że w pamięci są dwie reprezentacje tego samego obiektu? - Daj mi znać, jeśli pomieszam moją logikę. – jtkSource