懒汉式
一,定义与类型
定义:保证一个类仅有一个实例,并提供一个全局访问点
类型:创建型
二,适用场景
确保任何情况下绝对只有一个实例
线程池,数据库连接池用单例设计
三,优点:
1.在内存中只有一个实例,减少内存开销
2.避免对资源多重占用
3.设置全局访问点,严格控制访问
四,缺点;
没有接口,扩展困难
五,重点:
1.私有构造器
2.线程安全
3.延迟加载
4.序列化和反序列化安全
5.反射(防止)
六,实用技能
1.反编译
2.内存原理
3.多线程Debug
七,代码演示
1.懒汉式以及多线程Debug
单线程安全,代码演示
public class LazySingleton {
//声明静态的要被单例的对象
private static LazySingleton lazySingleton=null;
//私有构造器,为了不让外部new
private LazySingleton(){}
//获取对象的方法
public static LazySingleton getInstance(){
if(lazySingleton==null){
lazySingleton=new LazySingleton();
}
return lazySingleton;
}
}
单线程安全测试
public class Test {
public static void main(String[] args) {
LazySingleton lazySingleton=LazySingleton.getInstance();
System.out.println("program end");
}
}
断点调试后结果:
多线程不安全,代码演示
线程类
public class T implements Runnable {
@Override
public void run() {
LazySingleton lazySingleton=LazySingleton.getInstance();
System.out.println(Thread.currentThread().getName()+" "+lazySingleton);
}
}
测试类
public class Test {
public static void main(String[] args) {
//LazySingleton lazySingleton=LazySingleton.getInstance();
Thread t1=new Thread(new T());
Thread t2=new Thread(new T());
t1.start();
t2.start();
System.out.println("program end");
}
}
运行时线程安全
多线程Debug调试
挂起方式选thread,可手动调节
如图,两个线程创建了不同的实例
八,改进方案
饿汉式
public class HungrySingleton {
private final static HungrySingleton hungrySingleton;
static {
hungrySingleton=new HungrySingleton();
}
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
}