1 单列模式
单例模式是保证一个类仅只有一个实例,不允许有重复;单例类必须自己创建自己的唯一实例
1.1 单例模式的实现方式
懒汉式单例模式:在类加载时不初始化。
饿汉式单例模式:在类加载时就完成了初始化。
1. 直接实例化(饿汉)
public class Singleton {
//私有化构造
private Singleton (){}
//直接产生单例
private static final Singleton singlton = new Singletion();
//提供单例的唯一访问入口
public static Singleton getInstance(){
return singlton;
}
}
2.延迟实例化 (懒汉)
public class Singleton{
//私有化构造
private Singleton(){}
private static Singleton singleton = null;
public static Singleton getInstance(){
if(singlton!=null){
singleton = new Singleton();
}
return singleton;
}
}
- 与饿汉模式不同的是单例成员变量singleton 首先初始化null,在getInstance()内部进行延时实例化,返回单例对象,但是该实现方法线程不安全。
2.1 线程安全
public class Singleton{
//私有化构造
private Singleton(){}
private static Singleton singleton = null;
public static synchronized Singleton getInstance(){
if(singlton!=null){
singleton = new Singleton();
}
return singleton;
}
}
实现了线程安全,getInstance() 方法是同步方法,当多线程访问时程序变为了串行,但是对于程序的运行速度来说,有些代码不需要同步,降低了运行效率。
2.2.1 线程安全(部分代码块同步)
public class Singleton{
//私有化构造
private Singleton(){}
private static Singleton singleton = null;
public static Singleton getInstance(){
if(singlton!=null){
synchronized (Singleton.class){
if(singlton!=null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
部分代码块同步,提高了运行效率,使用了双重检验,来获取单例对象。
2.3(静态内部内)
public class Singleton {
//私有化构造
private Singleton(){}
//创建私有的静态内部类
private static class Singleton2{
private static final Singleton singleton = new Singleton();
}
public static final Singleton getInstance(){
return Singleton2.singleton;
}
}
- 静态内部类最大的不同在于内中没有synchronized关键字,提高了程序的运行速度,他是通过Singleton2来实现单例对象,对象Singleton2.singleton是线程安全的,当程序运行时,单例对象并不是立即加载的,当第一次调用Singleton2.singleton,单例对象才动态生成。因此利用静态内部类的方式是最优的。