Що таке перехідні та мінливі модифікатори?


126

Чи може хтось пояснити, що означає transientі volatileмодифікатори на Java?


3
Це явно не було питання, і це все одно дублікат (саме тому я проголосував за закриття). Дивіться, наприклад, чому у Java є перехідні змінні? і коли саме ви використовуєте мінливе ключове слово на Java? (та багато інших).
Паскаль Thivent


18
Це абсолютно правильне питання, що еквівалентно: stackoverflow.com/questions/215497 / ...
Баррі Fruitman

Відповіді:


156

volatileІ transientмодифікатори можуть бути застосовані до полів класів 1 , незалежно від типу поля. Крім того, вони не пов'язані між собою.

transientМодифікатор повідомляє підсистему сериализации об'єктів Java , щоб виключити поле при серіалізациі екземпляра класу. Коли об'єкт десеріалізується, поле буде ініціалізовано до значення за замовчуванням; тобто nullдля еталонного типу, нуля або falseдля примітивного типу. Зауважте, що JLS (див. 8.3.1.3 ) не говорить про те, що transientозначає, але відкладає специфікацію об’єктної серіалізації об'єкта Java . Інші механізми серіалізації можуть звернути увагу на transientсуттєвість поля . Або вони можуть ігнорувати це.

(Зверніть увагу, що JLS дозволяє staticполе оголошувати як таке transient. Ця комбінація не має сенсу для Java-об'єктної серіалізації, оскільки вона ніяк не серіалізує статику. Однак це може мати сенс і в інших контекстах, тому є певне обґрунтування для не забороняючи це прямо.)

volatileМодифікатор повідомляє JVM , що запис в поле завжди має бути синхронно продувають в пам'ять, і що читає поля завжди слід читати з пам'яті. Це означає, що до полів, позначених як мінливі, можна безпечно отримати доступ і оновити в багатопотоковому додатку без використання нативної або стандартної бібліотеки синхронізації. Аналогічно, читання та записування в мінливі поля є атомними. (Це не стосується >> енергонезалежних << longабо doubleполів, які можуть бути предметом "сльозотечі" на деяких JVM.) Відповідні частини JLS складають 8.3.1.4 , 17.4 та 17.7 .


1 - Але не для локальних змінних чи параметрів.


10

volatileта transientключові слова

1) transientключове слово використовується разом із змінними екземпляра для виключення їх із процесу серіалізації. Якщо поле є, transientйого значення не збережеться.

З іншого боку, volatileключове слово використовується для позначення змінної Java як "зберігається в основній пам'яті".

Кожне зчитування volatileзмінної буде зчитуватися з основної пам'яті комп'ютера, а не з кешу процесора, і кожне записування volatileзмінної буде записано в основну пам'ять, а не тільки в кеш процесора.

2) transientключове слово не може використовуватися разом із staticключовим словом, але volatileможе бути використане разом із static.

3) transientзмінні ініціалізуються зі значенням за замовчуванням під час десеріалізації, і присвоєння чи відновлення значення має оброблятися кодом програми.

Для отримання додаткової інформації дивіться мій блог:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html


2
Причина, яку transientзмінна не може бути використана разом із staticключовим словом - статичні змінні, належать до класу, а не до будь-якого окремого примірника. Поняття серіалізації стосується поточного стану об'єкта. Серіалізуються лише дані, пов’язані з конкретним екземпляром класу, тому статичні поля членів ігноруються під час серіалізації
Chaklader Asfak Arefe

Насправді, JLS дозволяє staticі transientвикористовувати їх разом. Проблема полягає в тому, що це мало сенсу, оскільки типові механізми серіалізації так чи інакше не зберігаються.
Стівен C

7

Летючі засоби, інші потоки можуть редагувати цю змінну. Тож компілятор дозволяє отримати доступ до них.

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

Тимчасовий означає, що при серіалізації об'єкта він повертає його дефоріатне значення за замовчуванням

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


5
"Отже, компілятор дозволяє отримати доступ до них." Ваше речення підказує, що потоки не мають доступу за замовчуванням. Тепер я читаю посилання та іншу відповідь, яку я розумію: компілятор не робить будь-якого проміжного зберігання змінної, пов'язаного з потоком, щоб інші потоки могли побачити зміни негайно.
геліос

Я заплутався в застосуванні С на летючому, а також у використанні java летючого. Я мав на увазі, що компілятор забезпечує доступ до значення actaul поля, а не кешованого значення.
Райнос

це означає більше.
Стівен C

1

Тимчасові:

Спершу потрібно знати, де це потрібно, як він подолає розрив.

1) Перехідний модифікатор доступу застосовується лише до змінних компонентів. Він не використовується з методом чи класом.

2) Перехідне ключове слово не можна використовувати поряд зі статичним ключовим словом.

3) Що таке серіалізація та де вона використовується? Серіалізація - це процес стійкості стану об'єкта. Це означає, що стан об'єкта перетворюється в потік байтів, який буде використовуватися для збереження (наприклад, зберігання байтів у файлі) або передачі (наприклад, відправка байтів через мережу). Таким же чином ми можемо використовувати десяріалізацію для повернення стану об'єкта з байтів. Це одна з важливих концепцій програмування Java, оскільки серіалізація здебільшого використовується в мережевому програмуванні. Об'єкти, які потрібно передати через мережу, повинні бути перетворені в байти. Перш ніж зрозуміти перехідне ключове слово, треба зрозуміти поняття серіалізації. Якщо читач знає про серіалізацію, пропустіть перший пункт.

Примітка 1) Перехідний процес в основному використовується для процесу серіалізації. Для цього клас повинен реалізувати інтерфейс java.io.Serializable. Усі поля в класі повинні бути серіалізаційними. Якщо поле не є серіалізаційним, воно повинно бути позначене тимчасовим.

Примітка 2) Коли відбувається деріаріалізований процес, вони встановлюються за замовчуванням - нулем, помилкою або нулем відповідно до обмеження типу.

Примітка 3) Перехідне ключове слово та його призначення? Поле, яке оголошується перехідним модифікатором, не братиме участі в серіалізованому процесі. Коли об'єкт серіалізується (зберігається в будь-якому стані), значення його перехідних полів ігноруються в послідовному поданні, тоді як поля, відмінні від перехідних полів, будуть брати участь у процесі серіалізації. Саме це і є основною метою перехідного ключового слова.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.