Главная » soft, programming » В чем разница между volatile и synchronized? Сессия сериализация.

В чем разница между volatile и synchronized? Сессия сериализация.

Ответ

synchronized

Ключевое слово языка программирования Java, которое
при применении к методу
или блоку кода, гарантирует,
что данный код будет выполняться
не более чем 1-им потоком одновременно.

….имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени (взаимоисключение или mutex), и также гарантия того, что данные, изменённые одним потоком, будут видны всем другим потокам (видимость изменений).

volatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean… Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будут «видеть» одно и то же значение переменной одновременно.
Вопрос
В чем разница между volatile и synchronized?
Ответ

synchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени (взаимоисключение или mutex), и также гарантия того, что данные, изменённые одним потоком, будут видны всем другим потокам (видимость изменений).

volatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean… Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будут «видеть» одно и то же значение переменной одновременно.

———

Если требуется уложить объект в сессию при использовании одиночного истанца, например Томкат не требуется сериализовывать объект.
Если требуется уложить объект в сессию при использовании кластера на jboss или Томкат с терракота(с общедоступным кэшем)
или Memcached(net-misc/memcached), то необходимо сделать класс сериалайзэбл.

Добавить к определению класса implements Serializable,  сгенерировать или вписать самому уникальный SerialUID(Eclipse это делает, если навести мышь на класс при warning). Если нет serialUID то одного и того же класса может оказаться разные serialUID так как сгенерированы на разных виртуальных машинах, поэтому десериализовать объект не получится при распределении сессии по нодам в кластере, так же не следует допускать разные классы с одинаковым serial UID .

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s