Czy ktoś może wyjaśnić, co oznaczają modyfikatory transient
i volatile
w Javie?
java
serialization
storage
modifier
Vijay Bhaskar Semwal
źródło
źródło
Odpowiedzi:
volatile
Itransient
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 lubfalse
dla typu pierwotnego. Zwróć uwagę, że JLS (patrz 8.3.1.3 ) nie podaje, cotransient
oznacza, ale stosuje się do specyfikacji Java Object Serialization Specification . Inne mechanizmy serializacji mogą zwracać uwagę natransient
-ość pola . Albo mogą to zignorować.(Zwróć uwagę, że JLS zezwala
static
na zadeklarowanie pola jakotransient
. 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
anidouble
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.
źródło
volatile
itransient
słowa kluczowe1)
transient
jest używane wraz ze zmiennymi instancji, aby wykluczyć je z procesu serializacji. Jeśli pole matransient
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 dovolatile
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 zestatic
słowem kluczowym alevolatile
może być używane razem zstatic
.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
źródło
transient
którego nie można użyć zmiennej razem zestatic
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 polastatic
itransient
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
http://www.geekinterview.com/question_details/2
źródło
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.
źródło