单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
饿汉式
特点:
- 线程安全
- 反射不安全
- 反序列化不安全
静态的变量,在序列化的过程中是不会被保存的,所以反序列化的过程中会重新生成实例,这样子就破坏了单列,要在反序列化的时候返回一个原来的对象才行
/**
* 饿汉式
* 一加载类就会触发单列对象
*/
public class singleton {
private static singleton instance=new singleton();
private singleton(){
System.out.println("执行");
}
public static singleton getInstance(){
return instance;
}
//固定写法,防止反序列化的时候出现多列现象
public Object readResolve(){
return instance;
}
}
懒汉式
线程不安全
/**
* 懒汉式
*/
public class Singleton4 {
private static Singleton4 instance=null;
private Singleton4(){
}
public static Singleton4 getInstance(){
if (instance==null){
instance=new Singleton4();
}
return instance;
}
}
改造后的懒汉式
package CBX;
/**
* 懒汉式
*/
public class Singleton4 {
private static Singleton4 instance=null;
private Singleton4(){
}
public static synchronized Singleton4 getInstance(){
if (instance==null){
instance=new Singleton4();
}
return instance;
}
}
双检索
public class Singleton{
//加volatile避免指令重排
private static volatile Singleton instance=null;
private Singleton(){};
public static Singleton getInstance(){
//双检索
if (instance==null){
synchronized (Singleton.class){
if (instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
静态内部类加载方式
只有当第一次调用getInstance方法时才会加载
线程安全,反序列化不安全
推荐使用
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return SingletonProducer.Instance;
}
private static class SingletonProducer {
private static final Singleton Instance = new Singleton();
}
}
枚举式
线程安全
反序列化安全
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
}