Czy ktoś może wyjaśnić, co oznaczają modyfikatory transient
i volatile
w Javie?
Czy ktoś może wyjaśnić, co oznaczają modyfikatory transient
i volatile
w Javie?
Odpowiedzi:
volatile
I transient
modyfikatory mogą być stosowane do pól klas 1 , niezależnie od typu pola. Poza tym nie są ze sobą spokrewnieni.
transient
Modyfikator 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. null
dla typu referencyjnego i zero lub false
dla typu pierwotnego. Zwróć uwagę, że JLS (patrz 8.3.1.3 ) nie podaje, co transient
oznacza, 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 static
na 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.)
volatile
Modyfikator 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 << long
ani double
pó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.
volatile
i transient
słowa kluczowe
1) transient
jest używane wraz ze zmiennymi instancji, aby wykluczyć je z procesu serializacji. Jeśli pole ma transient
wartość, 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 volatile
zmiennej zostanie zapisany w pamięci głównej, a nie tylko w pamięci podręcznej procesora.
2) transient
słowo kluczowe nie może być używane razem ze static
sł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
transient
którego nie można użyć zmiennej razem ze static
sł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
static
i transient
może być używane razem. Problem w tym, że nie ma to sensu, ponieważ typowe mechanizmy serializacji i tak nie utrwalają statystyk.
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
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.