В Java определено два интересных модификатора типа: transient и volatile. Эти модификаторы используются для обработки некоторых специальных ситуаций.
Когда экземплярная переменная объявлена как transient, то ее значение не будет запомнено при сохранении объекта. Например:
class Т {
transient int а; // Не будет сохраняться
int b; // Будет сохраняться
}
Если бы объект типа T записывался в постоянную область памяти, содержимое переменной а не было бы сохранено, в то время как содержимое b — было бы.
Модификатор volatile сообщает компилятору, что переменная, модифицированная с его помощью, может быть неожиданно изменена другими частями программы. Одна из этих ситуаций включает многопоточные программы. В многопоточной программе два или несколько потоков иногда совместно используют одну и ту же экземплярную переменную. По соображениям эффективности, каждый поток может хранить свою собственную, частную копию такой разделяемой переменной. Реальная (или главная — master-) копия переменной модифицируется в разные моменты времени, например, при входе в синхронизированный метод. Такой подход обычно работает прекрасно, но время от времени может быть неэффективным. В некоторых случаях, все, что действительно имеет значение, так это то, что master-копия переменной всегда отражает ее текущее состояние. Для гарантии подобной ситуации просто специфицируют переменную как volatile, что сообщает компилятору, что он должен всегда использовать master-копию volatile-переменной (или, по крайней мере, всегда сохранять любые частные копии, соответствующие текущим значениям главной копии, и наоборот).
Модификатор volatile в Java имеет примерно то же значение, что и в C/C++.