Образец двойной проверки упоминается в статье 48 книги «Эффективная Java», и указывается, что этот шаблон обычно не применим в Java. Структура этого шаблона заключается в следующем:
публичный ресурс getResource () {if (resource == null) {synchronized (this) {if (resource == null) {resource = new Resource (); }}} return resource; }Этот шаблон является улучшением следующего кода:
публичный синхронизированный ресурс getResource () {if (resource == null) {resource = new Resource (); } return Resource; }Цель этого кода - задержать инициализацию ресурса. Но каждый раз, когда вы получаете доступ к нему, вам нужно синхронизировать. Чтобы уменьшить накладные расходы синхронизации, доступен режим двойной проверки.
Причина, по которой режим двойной проверки недействителен в Java, заключается в том, что эталонный тип не является потоковым безопасным в отсутствие синхронизации. Для основных типов, за исключением длинных и двойных, двойной режим двойной проверки применим. Например, следующий код верен:
частный int count; public int getCount () {if (count == 0) {synchronized (this) {if (count == 0) {count = computeCount (); // Расчет трудоемкого отнимания}}} return Count; }Выше приведено общий вывод о идиоме двойной проверки в Java. Но все еще не закончилось, потому что шаблон памяти Java также улучшается. Даг Ли написал в своей статье: «Согласно последней модели памяти JAVA JAVA JSR133, если тип ссылки объявлен как нестабильный, режим двойной проверки будет работать». Таким образом, в будущем вам нужно использовать режим двойной проверки в Java, вы можете использовать следующий код:
частный нестабильный ресурс; публичный ресурс getResource () {if (resource == null) {synchronized (this) {if (resource == null) {resource = new Resource (); }}} return resource; }Конечно, именно в Java следует спецификация JSR133.
Следовательно, двойная проверка недоступна в J2SE 1.4 или более ранних версиях из-за записей вне порядка при настройке в многопоточной или JVM. Эта проблема была исправлена в J2SE 5.0, и изменчивое ключевое слово может использоваться для обеспечения многопоточности.
Public Class Singleton {Private volatile Singleton Extance = null; public singleton getInstance () {if (ancess == null) {synchronized (this) {if (encos == null) {encement = new singleton (); }} return Encement; }}Рекомендуемый метод - это инициализация на держателе спроса (IODH).
Public Class Singleton {Static Class Singletonholder {Static Singleton Encament = new Singleton (); } public static singleton getInstance () {return singletonholder.instance; }}Выше приведено все об этой статье, я надеюсь, что для всех будет полезно изучать программирование Java.