Может кто-нибудь объяснить, что означают модификаторы transient
и volatile
в Java?
java
serialization
storage
modifier
Виджай Бхаскар Семвал
источник
источник
Ответы:
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
Переходный означает, что когда вы сериализуете объект, он вернет значение по умолчанию при десериализации.
http://www.geekinterview.com/question_details/2
источник
Переходный:
Сначала нужно знать, где это нужно, как восполнить пробел.
1) Переходный процесс модификатора доступа применим только к переменному компоненту. Он не будет использоваться с методом или классом.
2) Ключевое слово Transient нельзя использовать вместе со статическим ключевым словом.
3) Что такое сериализация и где она используется? Сериализация - это процесс сохранения состояния объекта. Это означает, что состояние объекта преобразуется в поток байтов, который будет использоваться для сохранения (например, хранения байтов в файле) или передачи (например, отправки байтов по сети). Таким же образом мы можем использовать десериализацию, чтобы вернуть состояние объекта из байтов. Это одна из важных концепций программирования на Java, поскольку сериализация в основном используется в сетевом программировании. Объекты, которые необходимо передать по сети, необходимо преобразовать в байты. Прежде чем понимать ключевое слово transient, нужно понять концепцию сериализации. Если читатель знает о сериализации, пропустите первый пункт.
Примечание 1) Переходный процесс в основном используется для процесса сериализации. Для этого класс должен реализовать интерфейс java.io.Serializable. Все поля в классе должны быть сериализуемыми. Если поле не сериализуемое, оно должно быть помечено как временное.
Примечание 2) При выполнении десериализованного процесса они получают значение по умолчанию - ноль, ложь или ноль в соответствии с ограничением типа.
Примечание 3) Ключевое слово Transient и его цель? Поле, объявленное с модификатором transient, не будет участвовать в сериализованном процессе. Когда объект сериализуется (сохраняется в любом состоянии), значения его временных полей игнорируются в последовательном представлении, в то время как поле, отличное от временных полей, будет участвовать в процессе сериализации. Это основная цель ключевого слова transient.
источник