什么是单例模式?
单例模式顾名思义就是单个实例。比如各种Mgr,各种Factory,这样的一个项目里只需要有一个实例存在。话虽如此,我们封装了这样一个东西给别人用时,难保别人不会去new很多对象出来。所以,我们完全可以在代码上保证他,只有一个实例存在。这就是单例模式。
常见的两种形式
饿汉模式
示例代码
public class Single01 {
private static final Single01 INSTANCE = new Single01();
//私有的构造方法,外部无法new对象
private Single01() {
}
public static Single01 getInstance() {
return INSTANCE;
}
}
这里我们根据上面的定义来测试一下,是否只有一个实例存在
public static void main(String[] args) {
Single01 single01 = Single01.getInstance();
Single01 single011 = Single01.getInstance();
System.out.println(single01 == single011);
}
输出结果为:true
结论:该方式编写的单例模式,只有一个实例存在
懒汉模式
示例代码
public class Single02 {
private static Single02 INSTANCE;
private Single02() {
}
private static Single02 getInstance() {
if (INSTANCE == null) {
INSTANCE = new Single02();
}
return INSTANCE;
}
}
再来看下这形式的是否依然满足 只有一个实例存在
private static Single02 getInstance() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
//此处线程不安全
if (INSTANCE == null) {
INSTANCE = new Single02();
}
return INSTANCE;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> System.out.println(Single02.getInstance().hashCode())).start();
}
}
我们知道在同一个类中同一个对象的hashCode是相同的。
输出结果:存在hashCode不一致的情况
结论
懒汉模式,在多线程的情况下,会重复new对象。所以我们在使用单例模式的时候,最好使用第一种形式。