Модификаторы transient и volatile

Java определяет два интересных модификатора типов: transient и volatile. Эти модификаторы служат для управления некоторыми специфическими ситуациями.

Когда экземпляр переменной объявлен как transient, его значение не должно удерживаться, когда объект сохраняется. Например:

class Т {
transient int а; //не будет удерживаться
int b; // будет удерживаться
}

Здесь если объект типа Т записывается в область постоянного хранения, то содержимое а не должно сохраняться, а содержимое b — должно.

Модификатор volatile сообщает компилятору, что переменная, модифицированная с помощью volatile, может быть неожиданно изменена другими частями вашей программы. Одна из таких ситуаций возникает в мнОтопоточных программах. (Вы видели пример в главе 11.) В многопоточных программах иногда два или более потоков управления разделяют доступ к одной и той же переменной. Из соображений эффективности каждый поток может хранить свою собственную приватную копию этой переменной. Реальная (или мастер-) копия переменной обновляется в различные моменты, например при входе в метод synchronized. Хотя такой подход работает нормально, все же иногда он недостаточно эффективен. В некоторых случаях все, что действительно происходит — это то, что мастер-копия переменной всегда отражает ее текущее состояние. Чтобы обеспечить это, просто объявите переменную как volatile, что сообщит компилятору, что он должен всегда использовать мастер-копию переменной volatile (или же, как минимум, всегда держать приватные ее копии синхронизированными с мастер-копией и наоборот). Кроме того, доступ к мастер-копии переменной должен осуществляться в том же порядке, как он выполнялся к приватной копии.