Singleton:在Java中即指单例设计模式
单:唯一
例:实例
单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式
例如:代表JVM运行环境的RunTime类
要点:
一、某个类只能有一个实例
构造器私有化
二、它必须自行创建这个实例
含有一个该类的静态变量来保存这个唯一的实例
三、它必须自行向整个系统提供这个实例
对外提供获取该实例对象的方式:
(1)直接暴露(2)用静态变量的get方法获取
几种常见形式
饿汉式:直接创建对象,不存在线程安全问题
直接实例化饿汉式(简洁直观)
饿汉式:
直接创建实例对象。不管你是否需要这个对象都会创建
(1)构造器私有化
(2)自行创建,并且用静态变量保存
(3)向外提供这个实例
(4)强调这是一个单例,我们可以用final修改
public class singleton1{
pubilc static final Singleton1 INSTANCE = new Singleton1();
//构造器私有化
private Singleton1(){
}
}
枚举式(最简洁)
枚举类型:表示该类型的对象是有限的几个
我们可以限定为一个,就成了单例
public enum Singleton2{
INSTANCE
}
静态代码块饿汉式(适合复杂实例化)
public class Singleton3{
public static final Singleton3 INSTANCE;
static{
INSTANCE = new Singleton3();
}
private Singleton3(){
}
}
懒汉式:延迟创建对象
懒汉式:
延迟创建这个实例对象
(1)构造器私有化
(2)用一个静态变量保存这个唯一的实例
(3)提供一个静态方法,获取这个实例对象
线程不安全(适用于单线程)
public class Singleton4{
private static Singleton4 instance;
private Singleton4(){
}
public static Singleton4 getInstance(){
//当调用此静态方法时,会进行判断是否创建过 instance 如果为空就创建个,
//如果已经创建就不进行创建,因为 instance 是静态修饰所以只需要创建一次
if(instance == null){
//多线程情况下被调用 会存在 两个对象的地址不同,线程的不安全,
instance = new Singleton4():
}
return instance;
}
}
线程安全(适用于多线程)
懒汉式:
延迟创建这个实例对象
(1)构造器私有化
(2)用一个静态变量保存这个唯一的实例
(3)提供一个静态方法,获取这个实例对象
线程不安全(适用于单线程)
public class Singleton5{
private static Singleton5 instance;
private Singleton5(){
}
public static Singleton5 getInstance(){
//当调用此静态方法时,会进行判断是否创建过 instance 如果为空就创建个,
//如果已经创建就不进行创建,因为 instance 是静态修饰所以只需要创建一次
synchronized(Singleton5.class)
if(instance == null){
instance = new Singleton4():
}
return instance;
}
}
静态内部类形式(适用于多线程)
在内部类被加载和初始化时,才创建INSTANCE实例对象
静态内部类不会随着外部类加载和初始化而初始化,它是单独去加载和初始化的
因为是在内部类加载和初始化时,创建的,因为线程是安全的
public class Singleton6{
private Singleton6(){
}
private static class Inner{
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6(){
return Inner.INSTANCE;
}
}