Чи може хтось пояснити, що означає 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) Перехідне ключове слово та його призначення? Поле, яке оголошується перехідним модифікатором, не братиме участі в серіалізованому процесі. Коли об'єкт серіалізується (зберігається в будь-якому стані), значення його перехідних полів ігноруються в послідовному поданні, тоді як поля, відмінні від перехідних полів, будуть брати участь у процесі серіалізації. Саме це і є основною метою перехідного ключового слова.