说明
它提供了创建对象的最佳形式。
主要解决一个全局使用的类频繁地创建与销毁。
关键:构造函数私有,不能在外部显式的new对象。
目的:可以手写,并大概解释
简单懒汉式
/**
* @author 刘通
* @date 2022年01月16日 11:01
*/
public class Singleton{
//不能让外部调用
private Singleton (){
}
//初始化为null
private static Singleton instance= null;
//创建实例
public static Singleton getInstance(){
if (instance==null){
instance = new Singleton ();
}
return instance;
}
}
懒汉式,顾名思义就是用到的时候手动调用创建。
测试
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1==instance2); //true
}
简单饿汉式
public class Singleton{
private Singleton (){
}
private static Singleton instance= new Singleton();
public static Singleton getInstance(){
return instance;
}
}
不管使用不使用,都直接创建。
线程安全懒汉式
锁粒度太大
public class Singleton{
private Singleton(){
}
private static Singleton singleton = null;
public static synchronized Singleton getInstance(){
if (singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
懒汉式DCL(双重检测锁)
singleton = new Singleton();分为1、分配空间。2、创建实例。3、指向引用。
但是虚拟机可能会进行指令优化,把123顺序变为132.
如果13执行完其他线程抢占了时间片,则会创建不同的对象,就不是单例了。
为了防止指令重排,所以需要volatile关键字。
public class Singleton{
private Singleton(){
}
private static volatile Singleton singleton = null;
public static Singleton getInstance(){
if (singleton==null){
synchronized (Singleton.class){
if (singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}