单例模式的定义:一个对象在JVM中只能有一个实例。
在Java中通常有两种实现方法:懒汉式、饿汉式
懒汉式与饿汉式的区别
1、线程问题:懒汉式线程不安全,饿汉式线程安全
2、实例化的时机:懒汉式在第一次使用时初始化,饿汉式在加载.class(字节码文件)文件时初始化
3、内存消耗:懒汉式占用内存更小,饿汉式占用内存更多
4、效率:懒汉式比饿汉式更低效(因使用了同步关键字(synchronized))
懒汉式实现代码:
class Signal{
private static Signal signal;
//避免使用反射进行实例化
private Signal(){
}
public static Signal getSignal() {
if(signal==null){
synchronized (Signal.class) {
signal=new Signal();
}
}
return signal;
}
测试代码:使用多线程测试线程的安全性
public class SignalModel {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
pool.execute(()->{
Signal s1 = Signal.getSignal();
Signal s2= Signal.getSignal();
System.out.println(s1==s2);
System.out.println(s1);
});
}
}
}
饿汉式实现代码:
class Signal2{
private static final Signal2 signal=new Signal2();
//避免使用反射进行实例化
private Signal2(){
}
public static Signal2 getSignal() {
return signal;
}
}