一:饿汉式单例
启动容器就会初始化单例,不具备延时加载(懒加载功能),天然单例线程安全。
若此单例构建复杂,初始化后不立即用会造成内存浪费。
代码:
package com.design.pattern.single;
/**
* 测试饿汉式单例模式
*/
public class SingletonHungry{
//类初始化时,立即加载这个对象(没有延时加载的优势)。
//加载类时,天然的是线程安全的!
private final static SingletonHungry instance =new SingletonHungry();
//类的构造器私有,防止通过反射构造对象实例,
//但反射可以关闭安全检查创建对象实例
private SingletonHungry() {
}
public static SingletonHungry getInstance(){
return instance;
}
}
输出:
com.design.pattern.single.SingletonHungry@24df93dd
com.design.pattern.single.SingletonHungry@24df93dd
com.design.pattern.single.SingletonHungry@24df93dd
com.design.pattern.single.SingletonHungry@24df93dd
com.design.pattern.single.SingletonHungry@24df93dd
二:懒汉式单例
启动容器就不会初始化此单例,在调用时加载(具备延时加载即懒加载功能),所以单例线程不安全,调用创建单例需要加锁,根据加锁的粒度是方法级别还是方法块级别。延时加载,具备优势。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 懒汉式单例
*
*/
public class SingletonLazy implements Serializable{
private static SingletonLazy instance;
//防止反射调用私有构造器创建对象
public SingletonLazy() {
if(instance!=null){
throw new RuntimeException();
}
}
//加锁防止并发问题
public static synchronized SingletonLazy getInstance(){
if(instance==null)