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


126

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


3
Это явно не был вопрос, и это все равно дубликат (поэтому я проголосовал за закрытие). См., Например, Почему в Java есть временные переменные? и Когда именно вы используете ключевое слово volatile в Java? (и многие другие).
Паскаль Тивент


18
Это совершенно правильный вопрос, эквивалентный: stackoverflow.com/questions/215497/…
Барри Фрутман

Ответы:


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ключевым словом, заключается в том, что статические переменные принадлежат классу, а не какому-либо отдельному экземпляру. Концепция сериализации касается текущего состояния объекта. Сериализуются только данные, связанные с конкретным экземпляром класса, поэтому статические поля-члены игнорируются во время сериализации
Чакладер Асфак Арефе

Собственно, JLS позволяет staticи transientиспользовать вместе. Проблема в том, что в этом мало смысла, потому что типичные механизмы сериализации в любом случае не сохраняют статику.
Stephen C

7

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

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

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

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


5
«Таким образом, компилятор разрешает доступ к ним». Ваше предложение предполагает, что потоки по умолчанию не имеют доступа. Теперь я прочитал ссылку и другой ответ, который я понимаю: компилятор не выполняет какого-либо промежуточного хранения переменной, зависящего от потока, поэтому другие потоки могут сразу увидеть изменения.
helios

Я запутался в использовании C volatile и java использования volatile. Я имел в виду, что компилятор обеспечивает доступ к актуальному значению поля, а не к кэшированному значению.
Raynos

это значит больше, чем это.
Stephen C

1

Переходный:

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

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.