设计模式-单例
顾名思义单个实例,主要用于只要有一个示例存在的情况下
创建单例的方式如下,常用的就是饿汉式和懒汉式,也是面试常问的问题。
- 饿汉式
/**
* 饿汉式
* 类加载到内存就会实例化一个单例,JVM保证线程安全
* 简单实用,推荐使用
* 1.声明对象为private static final
* 2.构造方法私有化
* 缺点:不论是否用到,类装载时就完成了实例化
*/
public class Mgr01 {
//声明一个静态对象
private static final Mgr01 INSTANCE= new Mgr01();
//构造方法私有化,不提供对外使用
private Mgr01(){}
public static Mgr01 getInstance(){
return INSTANCE;
}
public static void main(String[] args) {
//判断对象是同一个
Mgr01 m1 = Mgr01.getInstance();
Mgr01 m2 = Mgr01.getInstance();
if (m1 == m2) {
System.out.println("the same one!");
}
}
}
- 懒汉式
什么时候用什么什么时候初始化,多线程访问时会出现问题,所以需要用到循环检查锁
/**
* 懒汉式
* 什么时候用,什么时候在初始化
*
*/
public class Mg02 {
//添加volatile防止语句重排
private static volatile Mg02 instance;
//构造方法私有化,不提供对外使用
private Mgr02(){}
public static Mg02 getInstance() {
if (instance == null) {
synchronized (Mg02.class) {
if (instance == null) {
instance = new Mg02();
}
}
}
return instance;
}
}
3.静态内部类方式
/**
* 静态内部类方式
*/
public class Mg03 {
private Mg03(){}
//静态内部类,使用JVM保证线程安全
//外部类被加载时,内部类不会被加载,被使用时才会加载,相比较饿汉式
//实现懒加载
private static class mg03Holder{
private static final Mg03 INSTANCE = new Mg03();
}
public static Mg03 getInstance(){
return mg03Holder.INSTANCE;
}
}
推荐使用最简单的饿汉式