java创建型模式之一:
单例模式(Singleton pattern)
什么是设计模式?
是一套被反复使用、多人知晓的、经过分类编目的代码设计经验的总结。
使用设计模式是为了可重用代码,让代码更容易被他人理解、保证代码的可靠性。
有些对象我们只需要一个,比如:配置文件、工具类、线程池、缓存、日志对象等,如果创造了多个实例,就会导致许多问题,如:占用过多资源、结果不一致等。
应用场景:有些对象只需要一个就足够了
作用:保证整个应用程序中某个实例有且只有一个
类型:饿汉式、懒 汉式
饿汉模式
第一步:私有化构造方法;
第二步:创建唯一的一个实例,使用privatestatic修饰;
第三步:提供一个用于获取实例的方法,使用public static修饰
------(不管用户是否需要,只要类加载,就会去创建该单例模式的对象,即假设总是处于饥饿状态)
package Singleton;
public class Singleton {
//step1
private Singleton() { }
//step2
private static Singleton instance = new Singleton();
//step3
public static SingletongetInstance(){
return instance;
}
}
懒汉模式
第一步:(同上);
第二步:声明唯一的一个实例,使用privatestatic修饰;
第三步:提供一个用于获取实例的方法,使用public static synchronized修饰
------(注意线程安全问题)
package Singleton;
public class Singleton {
//step1
private Singleton() { }
//step2
private static Singleton instance =null;
//step3
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
二者区别
1.速度问题:饿汉式加载慢,运行时获取对象快;懒汉模式加载类比较快,运行时获取对象慢。
2.安全问题:不加synchronized时,懒汉模式线程不安全。
改进懒汉-双重判断实例法:
当然,使用synchronized后,解决了懒汉式的安全问题,但示例的方法由于需要频繁的判断锁,损失了一些效率,可以使用下述方法(双重判断实例法)替代step3:
public static Singleton getInstance() {
/*
* 如果第一个线程获取到了单例的实例对象, 后面的线程再获取实例的时候不需要进入同步代码块中了
*/
if (instance== null) {
// 同步代码块用的锁是单例的字节码文件对象,且只能用这个锁
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance ;
}