Может кто-нибудь объяснить, что означают модификаторы transient
и volatile
в Java?
Что такое переходные и нестабильные модификаторы?
Ответы (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 - Но не для локальных переменных или параметров.
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
, заключается в том, что статические переменные принадлежат классу, а не какому-либо отдельному экземпляру. Концепция сериализации связана с текущим состоянием объекта. Сериализуются только данные, связанные с конкретным экземпляром класса, поэтому статические поля-члены игнорируются во время сериализации.
- person Arefe; 05.11.2018
static
и transient
вместе. Проблема в том, что в этом мало смысла, потому что типичные механизмы сериализации в любом случае не сохраняют статику.
- person Stephen C; 07.11.2018
Изменчивый означает, что другие потоки могут редактировать эту конкретную переменную. Таким образом, компилятор разрешает доступ к ним.
http://www.javamex.com/tutorials/synchronization_volatile.shtml
Переходный означает, что когда вы сериализуете объект, он вернет значение по умолчанию при десериализации.
http://www.geekinterview.com/question_details/2
Переходный:
Сначала нужно знать, где это нужно, как преодолеть разрыв.
1) Переходный процесс модификатора доступа применим только к переменному компоненту. Он не будет использоваться с методом или классом.
2) Ключевое слово Transient нельзя использовать вместе с ключевым словом static.
3) Что такое сериализация и где она используется? Сериализация - это процесс сохранения состояния объекта. Это означает, что состояние объекта преобразуется в поток байтов, который будет использоваться для сохранения (например, для хранения байтов в файле) или передачи (например, для отправки байтов по сети). Таким же образом мы можем использовать десериализацию, чтобы вернуть состояние объекта из байтов. Это одна из важных концепций программирования на Java, поскольку сериализация в основном используется в сетевом программировании. Объекты, которые необходимо передать по сети, необходимо преобразовать в байты. Прежде чем понимать ключевое слово transient, нужно понять концепцию сериализации. Если читатель знает о сериализации, пропустите первый пункт.
Примечание 1) Переходный процесс в основном используется для процесса сериализации. Для этого в классе должен быть реализован интерфейс java.io.Serializable. Все поля в классе должны быть сериализуемыми. Если поле не сериализуемое, оно должно быть помечено как временное.
Примечание 2) При выполнении десериализованного процесса они получают значение по умолчанию - ноль, ложь или ноль в соответствии с ограничением типа.
Примечание 3) Ключевое слово Transient и его цель? Поле, объявленное с модификатором transient, не будет участвовать в сериализованном процессе. Когда объект сериализуется (сохраняется в любом состоянии), значения его временных полей игнорируются в последовательном представлении, в то время как поле, отличное от временных полей, будет принимать участие в процессе сериализации. Это основная цель ключевого слова transient.
transient
, ни volatile
не являются модификаторами доступа. Модификаторы доступа: public
, protected
и private
.
- person Stephen C; 07.07.2021