English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Реализация Java SingletonКраткое изложение нескольких методов реализации Java Singleton
Singleton-паттерн часто пишут в книгах:
public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return instance; } }
Но на практике такие методы не используются, потому что существует серьезная проблема: при многопоточном доступе могут возникнуть несколько экземпляров!!
Ниже приведены несколько常用的 методов:
1. Использование ключевого слова synchronized
package singleton; public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; //Метод решения проблемы многопоточности, но он не очень эффективен! Porque cada vez que se llama, se debe bloquear! public static synchronized SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return instance; } public void print(){ System.out.println("thread_id:"+Thread.currentThread().getId()); } private static Object object = new Object(); //Очень хитрый метод, который блокирует только при null, после этого больше не блокирует public static SingleTon1 getInstance2(){ if(instance == null){ synchronized (object){ instance = new SingleTon1(); } } return instance; } }
2. Блокировка:
package singleton; import java.util.concurrent.locks.ReentrantLock; public class SingleTon2 { private SingleTon2(){ } private static ReentrantLock lock = new ReentrantLock(); private static SingleTon2 instance = null; public void print(){ System.out.println("thread_id:"+Thread.currentThread().getId()); } public static SingleTon2 getInstance2(){ if(instance == null){ lock.lock(); if(instance == null){ // 注意这里还要判断下!! instance = new SingleTon2(); } lock.unlock(); } return instance; } }
3. Использование статического переменного:
package singleton; public class SingleTon3 { public static void print(){ System.out.println("thread_id:"+Thread.currentThread().getId()); } public static Nested getNested(){ return Nested.instance; } //Этот класс используется для создания单体. static class Nested{ private Nested(){ } static Nested instance = new Nested(); } }
Вот несколько常用的创建单例模式:
Тест код: Test测试代码:
package singleton; import singleton.SingleTon3.Nested; public class Test2 { public static void main(String[] args) { // TODO Автоматически сгенерированный метод шаблона Nested singleton; Myrunnable m1 = new Myrunnable(); Myrunnable2 m2 = new Myrunnable2(); new Thread(m1).start(); new Thread(m2).start(); if(m1.singleton == m2.singleton){ // Это одно и то же System.out.println("Это одно и то же"); else{ } System.out.println("Это не одно и то же"); } } } class Myrunnable implements Runnable{ Nested singleton; @Override public void run() { // TODO Автоматически сгенерированный метод шаблона singleton = SingleTon3.getNested(); SingleTon3.print(); } } class Myrunnable2 implements Runnable{ Nested singleton; @Override public void run() { // TODO Автоматически сгенерированный метод шаблона singleton = SingleTon3.getNested(); SingleTon3.print(); } }
Вывод:
Это одно и то же
thread_id:11
thread_id:10
Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!
Заявление: содержимое статьи взято из Интернета, авторские права принадлежат соответствующему автору, материал был предоставлен пользователями Интернета в порядке добровольного участия и самостоятельно загружен, сайт не обладает правами собственности, материал не был отредактирован вручную и не несет ответственности за него. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для подачи жалобы,并提供相关证据. При подтверждении факта нарушения авторских прав сайт незамедлительно удалят涉嫌侵权的内容。