JAVA设计模式【二】 - 单例模式
单例模式
单例模式是比较常用和容易理解的一种设计模式,目的是一个单例对象的类只允许存在一个实例。
常用的例如数据库连接池和多线程的线程池就是单例模式的。
单例模式的几种实现方式:
饿汉模式:
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
private static Singleton ourInstance = new Singleton();
public static Singleton getInstance() {
return ourInstance;
}
private Singleton() {}
}
这种方式 因为定义实例为静态的,所以在虚拟机对该类进行装载的时候就会生成实例。属于常用的方式,但是缺点在于如果不需要调用该实例会对内存造成浪费。
非线程安全-懒汉模式:
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
public static Singleton singleton;
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
private Singleton() {}
}
顾名思义,就是在不需要该实例的时候不创建,只有在第一次用到的时候会创建该实例,但是此方式不建议使用,因为是非线程安全的,如果多线程同时获取实例,并且在同时验证实例为空时通过,会创建两个实例。
线程安全-同步-懒汉模式:
public class Singleton {
public static Singleton singleton;
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
private Singleton() {}
}
在获取对象的实例方法上通过synchronized关键字为该方法添加同步锁,这样可以保证只有一个线程会调用该方法,但是如果多线程同时过来时就会发生线程堵塞,造成效率性能的极度下降,所以不建议采用此方式。
非线程安全-同步代码块-懒汉模式:
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
public static Singleton singleton;
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class){
singleton = new Singleton();
}
}
return singleton;
}
private Singleton() {}
}
当多个线程同时进入到null判断之后,虽然锁的是代码块,但是还会执行两次实例化。
双重检查模式
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
public static Singleton singleton;
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
private Singleton() {}
}
这样可以保证是线程安全的。
静态内部类模式
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
private Singleton() {}
private static class SingletonIns{
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonIns.instance;
}
}
这样与饿汉模式相似,该模式是懒加载模式,饿汉模式在类被装载时创建实例,而该模式,只有在调用getInstance时才会装载静态内部类,然后创建实例。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.