单列模式

单列模式:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建,不能延时加载。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建,能延时加载。

饿汉式

线程安全,浪费内存

class SingleInstance{
    private static SingleInstance instance=new SingleInstance();
    
    private SingleInstance(){}

    public static SingleInstance getInstance(){
    	return instance;
  }
}

懒汉式

线程不安全(需要用synchronized来处理),可以延迟加载

class SingleInstance{
    private static SingleInstance instance;
    
    private SingleInstance(){}

    public static synchronized SingleInstance getInstance(){
        if(instance==null){
        	instance =new SingleInstance();
        }
        return single;
    }
}

双重检查加锁模式(懒汉模式优化版):

双重检查模式是对懒汉式的优化,在new SingleInstance之前,加一个类锁。注意,成员变量instance最好使用volatile修饰,否则若在无参构造中初始化一个其他的成员变量,会产生指令重排序,导致新创建的对象获取不到最新的成员变量值。

public class SingleInstance {  
    private volatile static SingleInstance instance; //声明成 volatile  
    
    private SingleInstance (){}  
  
    public static SingleInstance getInstance() {  
        if (instance == null) {                           
            synchronized (SingleInstance.class) {  
                if (instance == null) {         
                    instance = new SingleInstance();  
                }  
            }  
        }  
        return instance;  
    }  
}  

静态内部类(推荐)

声明类时,成员变量中不声明实例变量,而是放到静态内部类中。这种方式和懒汉式有些相似,它们都采用了类装载的机制来保证初始化实例时只有一个线程,将实例的初始化放到了静态类中去实现,从而实现了懒加载。(采用静态初始化器的方式,它可以由JVM来保证线程的安全性,解决同步问题)

public class SingleInstance {
 
    private SingleInstance() {
    }
 
    public static SingleInstance getInstance() {
        return Holder.instance;
    }
 
    private static class Holder {
        private static SingleInstance instance = new SingleInstance();
    }
}

你可能感兴趣的:(java,#,设计模式)