单例模式是最常用的设计模式之一,作为一个攻城狮怎么可以不掌握它呢,单例模式一般分为懒汉式和饿汉式。
(1)懒汉式(在需要的时候在进行对象的创建)
/**
* 单例设计模式,只有一个对象,用来管理全局共享的资源,如数据库连接和线程池等
* 实际上打印机工作也是单例模式的
*/
public class Singleton {
//利用一个静态变量来存储Singleton的唯一实例
private static Singleton uniqueInstance;
//将构造器私有化
private Singleton(){}
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
(2)饿汉式(提前把对象创建好)
/**
* 如果应用程序总是创建并使用单例实例,或者是在创建和运行时方面的负担不太繁重,就急切创建实例
* 依赖JVM在加载类是就创建类的唯一单例对象。JVM保证了任何线程在访问uniqueInstance时,一定先创建了这个对象。
*/
public class Singleton{
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
(3)利用双重检查锁机制实现线程安全
/**
* 利用双重检查锁机制,在getInstance()减少使用同步
* 利用双重检查锁(double-checked locking),首先检查实例是否已经创建了,如果尚未创建才进行同步
* 这样,只有在第一次才进行同步。
*/
public class Singleton{
private volatile static Singleton uniqueInstance;
//构造器私有化
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
(4)使用匿名内部类来实现
/**
* 可以使用静态内部类来实现,利用classloader在初始化时只有一个线程。
* 虽然被装载,但是不显示调用时不会创建对象
*/
public class Singleton{
private static class SingletonHolder{
private static final Singleton uniqueInstance = new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.uniqueInstance;
}
}