保证整一个系统中一个类只有一个实例
简单饿汉
package com.example.demo.designPatterns.singleTon.ehan;
/***
* 饿汉式
*/
public class Ehan {
//事先new出来
private static Ehan singleton = new Ehan();
//私有自己的构造方法 谁都不能new
private Ehan(){
}
//提供一个公共方法 给其他人获取自身
public static Ehan getInstance(){
return singleton;
}
public static class Test1 {
public static void main(String[] args) {
//不能new了
//Singleton singleton = new Singleton(); 报错
//只能通过类.方法的方式去获取
Ehan instance = getInstance();
System.out.println(instance.getClass());
}
}
}
简单懒汉
package com.example.demo.designPatterns.singleTon.lanhan;
/***
* 懒汉式
*/
public class Lanhan {
//事先new出来
private static Lanhan singleton = null;
//私有自己的构造方法 谁都不能new
private Lanhan(){
}
//提供一个公共方法 给其他人获取自身 加入if判断
public static Lanhan getInstance(){
if(singleton==null){
singleton = new Lanhan();
}
return singleton;
}
public static class Test2 {
public static void main(String[] args) {
//不能new了
//Singleton singleton = new Singleton(); 报错
//只能通过类.方法的方式去获取
Lanhan instance = getInstance();
System.out.println(instance.getClass());
}
}
}
实际开发中的使用双重检查
package com.example.demo.designPatterns.singleTon.lanhan;
public class Singleton {
private static volatile Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
- Double-Check概念是多线程开发中常使用到的,如代码中所示,我们进行了两
次if (singleton == null)检查,这样就可以保证线程安全了。 - 这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),
直接return实例化对象,也避免的反复进行方法同步. - 线程安全;延迟加载;效率较高
- 结论:在实际开发中,推荐使用这种单例设计模式
实际开发中使用的静态内部类模式
package com.example.demo.designPatterns.singleTon.lanhan;
public class Singleton2 {
private Singleton2(){};
private static class SingletonHolder{
private static final Singleton2 instance = new Singleton2();
}
public static Singleton2 Singleton2(){
return SingletonHolder.instance;
}
}