Co to są przejściowe i zmienne modyfikatory?

126

Czy ktoś może wyjaśnić, co oznaczają modyfikatory transienti volatilew Javie?

Vijay Bhaskar Semwal
źródło
3
To oczywiście nie było pytanie, a i tak jest to duplikat (dlatego głosowałem za zamknięciem). Zobacz na przykład Dlaczego Java ma zmienne przejściowe? i Kiedy dokładnie używasz słowa kluczowego volatile w Javie? (i wiele innych).
Pascal Thivent
możliwy duplikat For what is used "volatile"?
Jeff
18
To jest całkowicie poprawne pytanie, równoważne z: stackoverflow.com/questions/215497/…
Barry Fruitman

Odpowiedzi:

156

volatileI transientmodyfikatory mogą być stosowane do pól klas 1 , niezależnie od typu pola. Poza tym nie są ze sobą spokrewnieni.

transientModyfikator opowiada obiekt serializacji podsystem Java, aby wykluczyć z boiska podczas szeregowania instancję klasy. Gdy obiekt zostanie następnie zdeserializowany, pole zostanie zainicjowane do wartości domyślnej; tj. nulldla typu referencyjnego i zero lub falsedla typu pierwotnego. Zwróć uwagę, że JLS (patrz 8.3.1.3 ) nie podaje, co transientoznacza, ale stosuje się do specyfikacji Java Object Serialization Specification . Inne mechanizmy serializacji mogą zwracać uwagę na transient-ość pola . Albo mogą to zignorować.

(Zwróć uwagę, że JLS zezwala staticna zadeklarowanie pola jako transient. Ta kombinacja nie ma sensu w przypadku serializacji obiektów Java, ponieważ i tak nie serializuje statystyk. Jednak może mieć sens w innych kontekstach, więc istnieje pewne uzasadnienie dla nie zabraniając tego wprost.)

volatileModyfikator mówi JVM, że zapisy do pola powinna być zawsze synchronicznie spłukuje do pamięci, a które brzmi pola należy zawsze czytać z pamięci. Oznacza to, że pola oznaczone jako nietrwałe mogą być bezpiecznie dostępne i aktualizowane w aplikacji wielowątkowej bez korzystania z natywnej lub standardowej synchronizacji opartej na bibliotekach. Podobnie odczyty i zapisy w polach lotnych są atomowe. (Nie dotyczy to >> nieulotnych << longani doublepól, które mogą podlegać „rozdzieraniu słów” na niektórych JVM.) Odpowiednie części JLS to 8.3.1.4 , 17.4 i 17.7 .


1 - Ale nie do lokalnych zmiennych lub parametrów.

Stephen C.
źródło
10

volatilei transientsłowa kluczowe

1) transient jest używane wraz ze zmiennymi instancji, aby wykluczyć je z procesu serializacji. Jeśli pole ma transientwartość, nie zostanie utrwalona.

Z drugiej strony, volatile słowo kluczowe służy do oznaczania zmiennej Java jako „przechowywanej w pamięci głównej”.

Każde przeczytanie pliku volatile zmiennej zostanie odczytany z głównej pamięci komputera, a nie z pamięci podręcznej procesora, a każdy zapis do volatilezmiennej zostanie zapisany w pamięci głównej, a nie tylko w pamięci podręcznej procesora.

2) transientsłowo kluczowe nie może być używane razem ze staticsłowem kluczowym alevolatile może być używane razem z static.

3) transient zmienne są inicjalizowane z wartością domyślną podczas deserializacji i tam przypisanie lub przywrócenie wartości musi być obsługiwane przez kod aplikacji.

Więcej informacji można znaleźć na moim blogu:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html

Rajesh Dixit
źródło
2
Powodem, dla transientktórego nie można użyć zmiennej razem ze staticsłowem kluczowym, jest to, że zmienne statyczne należą do klasy, a nie do poszczególnych instancji. Pojęcie serializacji dotyczy bieżącego stanu obiektu. Serializowane są tylko dane powiązane z konkretną instancją klasy, dlatego statyczne pola
składowe
W rzeczywistości JLS pozwala statici transientmoże być używane razem. Problem w tym, że nie ma to sensu, ponieważ typowe mechanizmy serializacji i tak nie utrwalają statystyk.
Stephen C
7

Zmienna oznacza, że ​​inne wątki mogą edytować tę konkretną zmienną. Kompilator umożliwia więc dostęp do nich.

http://www.javamex.com/tutorials/synchronization_volatile.shtml

Przejściowy oznacza, że ​​podczas serializacji obiektu zwróci on swoją domyślną wartość podczas deserializacji

http://www.geekinterview.com/question_details/2

Raynos
źródło
5
„Więc kompilator umożliwia dostęp do nich”. Twoje zdanie sugeruje, że wątki domyślnie nie mają dostępu. Teraz czytam link i inną odpowiedź, którą rozumiem: kompilator nie wykonuje żadnego rodzaju pośredniego przechowywania zmiennej specyficznego dla wątku, aby inne wątki mogły natychmiast zobaczyć zmiany.
helios
Uzyskałem użycie volatile w języku C i użycie volatile w Javie. Miałem na myśli, że kompilator zapewnia, że ​​ma dostęp do wartości actaul pola, a nie do wartości zapisanej w pamięci podręcznej.
Raynos
to znaczy więcej niż to.
Stephen C
1

Przejściowy:

Najpierw trzeba wiedzieć, gdzie to potrzebne, jak wypełnić lukę.

1) Przejściowy modyfikator dostępu ma zastosowanie tylko do składnika zmiennego. Nie będzie używany z metodą ani klasą.

2) Słowo kluczowe Transient nie może być używane razem ze słowem kluczowym static.

3) Co to jest serializacja i gdzie jest używana? Serializacja to proces polegający na utrwalaniu stanu obiektu. Oznacza to, że stan obiektu jest konwertowany na strumień bajtów, który ma być użyty do utrwalania (np. Przechowywanie bajtów w pliku) lub przesyłania (np. Wysyłanie bajtów przez sieć). W ten sam sposób możemy użyć deserializacji, aby przywrócić stan obiektu z bajtów. Jest to jedna z ważnych koncepcji programowania w języku Java, ponieważ serializacja jest najczęściej stosowana w programowaniu sieciowym. Obiekty, które mają być przesyłane przez sieć, należy zamienić na bajty. Przed zrozumieniem słowa kluczowego przejściowego należy zrozumieć koncepcję serializacji. Jeśli czytelnik wie o serializacji, pomiń pierwszy punkt.

Uwaga 1) Przejściowe są używane głównie w procesie serializacji. W tym celu klasa musi implementować interfejs java.io.Serializable. Wszystkie pola w klasie muszą mieć możliwość serializacji. Jeśli pola nie można serializować, należy je oznaczyć jako przejściowe.

Uwaga 2) Po przeprowadzeniu procesu deserializacji są ustawiane na wartość domyślną - zero, false lub null zgodnie z ograniczeniem typu.

Uwaga 3) Słowo kluczowe przejściowe i jego cel? Pole, które jest zadeklarowane z modyfikatorem przejściowym, nie będzie brało udziału w serializowanym procesie. Gdy obiekt jest serializowany (zapisywany w dowolnym stanie), wartości jego pól przejściowych są ignorowane w reprezentacji szeregowej, podczas gdy pole inne niż pola przejściowe będzie brało udział w procesie serializacji. To jest główny cel słowa kluczowego przejściowego.

Vishal Sheth
źródło