一.单例模式
全局唯一并且所有程序都可以使用的对象,就是单例模式
二.单例模式的两种实现方式:
1.饿汉方式(线程安全的)
2.懒汉方式
写单例模式(不允许new)三个步骤:
1.将构造函数设置为私有的
2.创建一个静态的类变量(让第三步的方法返回的)
3.给外部提供获取单例的方法
饿汉方式:
优点:实现简单、不存在线程安全问题,因为饿汉的方式是随着程序的启动而初始化的,因为类加载是线程安全的,所以他是线程安全的
缺点:随着程序的启动而启动,有可能在整个程序的运行周期里面都没有用到,这样就带来了不必要的开销
//饿汉方式
static class Singleton{
//1.将构造函数设置为私有的
private Singleton(){
}
//2.创建一个静态的类变量(让第三步的方法返回的)
private static Singleton singleton=new Singleton();
//3.给外部提供获取单例的方法
public static Singleton getInstance(){
return singleton;
}
}
懒汉方式(要求能够手写):
它不会随着程序的启动而初始化,而是等到有人调用它时,它才会初始化。
//懒汉模式
static class Singleton{
//1.将构造函数设置为私有的
private Singleton(){
}
//2.设置一个静态的类变量,为第三部返回使用
private static volatile Singleton singleton=null;
//3.为外部提供获取单例的方法
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
实例化时分为三步,所以禁止指令重排序的问题来保证线程安全,用volatile 关键字