Что такое переходные и нестабильные модификаторы?

Может кто-нибудь объяснить, что означают модификаторы transient и volatile в Java?


person Vijay Bhaskar Semwal    schedule 23.08.2010    source источник
comment
Это явно не было вопросом, и это все равно дубликат (поэтому я проголосовал за закрытие). См., Например, Почему в Java есть временные переменные? и Когда именно вы используете ключевое слово volatile в Java? (и многие другие).   -  person Pascal Thivent    schedule 23.08.2010
comment
возможный дубликат Для чего используется volatile?   -  person Jeff    schedule 27.08.2010
comment
Это совершенно правильный вопрос, эквивалентный: stackoverflow.com/questions/215497/   -  person Barry Fruitman    schedule 21.01.2014


Ответы (4)


Модификаторы 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 - Но не для локальных переменных или параметров.

person Stephen C    schedule 23.08.2010

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

person Rajesh Dixit    schedule 24.12.2016
comment
Причина, по которой переменную transient нельзя использовать вместе с ключевым словом static, заключается в том, что статические переменные принадлежат классу, а не какому-либо отдельному экземпляру. Концепция сериализации связана с текущим состоянием объекта. Сериализуются только данные, связанные с конкретным экземпляром класса, поэтому статические поля-члены игнорируются во время сериализации. - person Arefe; 05.11.2018
comment
Фактически, JLS позволяет использовать static и transient вместе. Проблема в том, что в этом мало смысла, потому что типичные механизмы сериализации в любом случае не сохраняют статику. - person Stephen C; 07.11.2018

Изменчивый означает, что другие потоки могут редактировать эту конкретную переменную. Таким образом, компилятор разрешает доступ к ним.

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

Переходный означает, что когда вы сериализуете объект, он вернет значение по умолчанию при десериализации.

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

person Raynos    schedule 23.08.2010
comment
Таким образом, компилятор разрешает доступ к ним. Ваше предложение предполагает, что потоки по умолчанию не имеют доступа. Теперь я прочитал ссылку и другой ответ, который я понимаю: компилятор не выполняет какого-либо промежуточного хранения переменной, зависящего от потока, поэтому другие потоки могут сразу увидеть изменения. - person helios; 23.08.2010
comment
Я запутался в использовании volatile на языке C и использовании volatile в java. Я имел в виду, что компилятор обеспечивает доступ к актуальному значению поля, а не к кэшированному значению. - person Raynos; 23.08.2010

Переходный:

Сначала нужно знать, где это нужно, как преодолеть разрыв.

1) Переходный процесс модификатора доступа применим только к переменному компоненту. Он не будет использоваться с методом или классом.

2) Ключевое слово Transient нельзя использовать вместе с ключевым словом static.

3) Что такое сериализация и где она используется? Сериализация - это процесс сохранения состояния объекта. Это означает, что состояние объекта преобразуется в поток байтов, который будет использоваться для сохранения (например, для хранения байтов в файле) или передачи (например, для отправки байтов по сети). Таким же образом мы можем использовать десериализацию, чтобы вернуть состояние объекта из байтов. Это одна из важных концепций программирования на Java, поскольку сериализация в основном используется в сетевом программировании. Объекты, которые необходимо передать по сети, необходимо преобразовать в байты. Прежде чем понимать ключевое слово transient, нужно понять концепцию сериализации. Если читатель знает о сериализации, пропустите первый пункт.

Примечание 1) Переходный процесс в основном используется для процесса сериализации. Для этого в классе должен быть реализован интерфейс java.io.Serializable. Все поля в классе должны быть сериализуемыми. Если поле не сериализуемое, оно должно быть помечено как временное.

Примечание 2) При выполнении десериализованного процесса они получают значение по умолчанию - ноль, ложь или ноль в соответствии с ограничением типа.

Примечание 3) Ключевое слово Transient и его цель? Поле, объявленное с модификатором transient, не будет участвовать в сериализованном процессе. Когда объект сериализуется (сохраняется в любом состоянии), значения его временных полей игнорируются в последовательном представлении, в то время как поле, отличное от временных полей, будет принимать участие в процессе сериализации. Это основная цель ключевого слова transient.

person Vishal Sheth    schedule 24.01.2020
comment
Это должно было получить наибольшее количество голосов! Красиво объяснено. - person rez; 10.12.2020
comment
Nit-pick: ни transient, ни volatile не являются модификаторами доступа. Модификаторы доступа: public, protected и private. - person Stephen C; 07.07.2021