Чи може хтось пояснити, що означає transient
і volatile
модифікатори на Java?
Чи може хтось пояснити, що означає transient
і volatile
модифікатори на Java?
Відповіді:
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 - Але не для локальних змінних чи параметрів.
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
transient
змінна не може бути використана разом із static
ключовим словом - статичні змінні, належать до класу, а не до будь-якого окремого примірника. Поняття серіалізації стосується поточного стану об'єкта. Серіалізуються лише дані, пов’язані з конкретним екземпляром класу, тому статичні поля членів ігноруються під час серіалізації
static
і transient
використовувати їх разом. Проблема полягає в тому, що це мало сенсу, оскільки типові механізми серіалізації так чи інакше не зберігаються.
Летючі засоби, інші потоки можуть редагувати цю змінну. Тож компілятор дозволяє отримати доступ до них.
http://www.javamex.com/tutorials/synchronization_volatile.shtml
Тимчасовий означає, що при серіалізації об'єкта він повертає його дефоріатне значення за замовчуванням
Тимчасові:
Спершу потрібно знати, де це потрібно, як він подолає розрив.
1) Перехідний модифікатор доступу застосовується лише до змінних компонентів. Він не використовується з методом чи класом.
2) Перехідне ключове слово не можна використовувати поряд зі статичним ключовим словом.
3) Що таке серіалізація та де вона використовується? Серіалізація - це процес стійкості стану об'єкта. Це означає, що стан об'єкта перетворюється в потік байтів, який буде використовуватися для збереження (наприклад, зберігання байтів у файлі) або передачі (наприклад, відправка байтів через мережу). Таким же чином ми можемо використовувати десяріалізацію для повернення стану об'єкта з байтів. Це одна з важливих концепцій програмування Java, оскільки серіалізація здебільшого використовується в мережевому програмуванні. Об'єкти, які потрібно передати через мережу, повинні бути перетворені в байти. Перш ніж зрозуміти перехідне ключове слово, треба зрозуміти поняття серіалізації. Якщо читач знає про серіалізацію, пропустіть перший пункт.
Примітка 1) Перехідний процес в основному використовується для процесу серіалізації. Для цього клас повинен реалізувати інтерфейс java.io.Serializable. Усі поля в класі повинні бути серіалізаційними. Якщо поле не є серіалізаційним, воно повинно бути позначене тимчасовим.
Примітка 2) Коли відбувається деріаріалізований процес, вони встановлюються за замовчуванням - нулем, помилкою або нулем відповідно до обмеження типу.
Примітка 3) Перехідне ключове слово та його призначення? Поле, яке оголошується перехідним модифікатором, не братиме участі в серіалізованому процесі. Коли об'єкт серіалізується (зберігається в будь-якому стані), значення його перехідних полів ігноруються в послідовному поданні, тоді як поля, відмінні від перехідних полів, будуть брати участь у процесі серіалізації. Саме це і є основною метою перехідного ключового слова.