什么是单例模式?
单例模式指的是 一个类 只产生 一个实例化对象
目的(作用):
保证在Java应用程序中,一个类Class只有一个实例存在。
常见的模式:
饿汉模式
实现代码:
public class SingleDemo0 { private static SingleDemo0 singleDemo0 = new SingleDemo0(); private SingleDemo0(){} public static SingleDemo0 getInstance(){ return singleDemo0; } public static void main(String[] args) { // 通过 静态方法取出 实例对象 SingleDemo0 singleDemo0 = getInstance(); System.out.println(singleDemo0); } }
优点:
1、仅实例化一次
2、线程是安全的
3、获取实例速度快
缺点:类加载时立即实例化对象,实例化的对象不被使用,造成内存的浪费。
懒汉模式
实现代码:
public class SingleDemo1 { private static SingleDemo1 singleDemo1 = null; private SingleDemo1(){} public static SingleDemo1 getInstance(){ if( singleDemo1 == null ){ return singleDemo1 = new SingleDemo1(); } return singleDemo1; } public static void main(String[] args) { // 获取 实例对象 SingleDemo1 singleDemo1 = getInstance(); System.out.println(singleDemo1); } }
优点:
1、获取实例时才进行实例的初始化,节省系统资源
缺点:
1、非线程安全
2、系统开销大(每一次获取都需要进行非空检查)
让 懒汉模式 变得 线程安全 ( 双重检查锁 )
实现代码:
public class SingleDemo2 { private static volatile SingleDemo2 singleDemo2 = null; private SingleDemo2(){} public static SingleDemo2 getInstance(){ if( singleDemo2 == null ){ synchronized (SingleDemo2.class){ if( singleDemo2 == null ){ return new SingleDemo2(); } } } return singleDemo2; } }
内部类实现方式
public class SingleDemo3 { private SingleDemo3(){} private static class getSingleDemo3Class{ private static SingleDemo3 singleDemo3 = new SingleDemo3(); } public static SingleDemo3 getInstance(){ return getSingleDemo3Class.singleDemo3; } }
优点:
1、内部类只有在外部类被调用才加载,从而实现延迟加载
2、线程安全,且不用加锁