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