你正在写的单例模式,也许并不像你想的那样安全。
单例模式算是设计模式中最为容易理解,也是最容易实现的一种模式。很多人经常会说单例模式那么简单,为什么面试的时候还要考?简单?你的单例在
多线程环境下真的安全吗?双检索知道是什么吗?
哦,对了,也许你常见的和常用的就是这种写法:
public class SingleFactory {
private static SingleFactory instance;
private SingleFactory() {
}public static SingleFactory getInstance() {
if (instance == null) {
instance = new SingleFactory();
}
return instance;
}}
嗯,看起来确实是那么回事,反正static全局只有一个嘛,永远都会是那一个呀!
呵呵,too young too simple!
上段最垃圾的多线程代码,你就知道自己有多么可悲(你被多少教科书或是老师给骗了)
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println(SingleFactory.getInstance().hashCode());
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println(SingleFactory.getInstance().hashCode());
}
});
Thread t3 = new Thread(new Runnable() {
public void run() {
System.out.println(SingleFactory.getInstance().hashCode());
}
});
Thread t4 = new Thread(new Runnable() {
public void run() {
System.out.println(SingleFactory.getInstance().hashCode());
}
});
t1.start();
t2.start();
t3.start();
t4.start();
}
}
也许你的可能输出结果一样,但是请多试几次,但至少我的是这样:
18064701
18064701
2814081
18064701
hashCode证明一切。
(有过被欺骗经历的小伙或小姑娘可以去找骗你的那个人拼命了,只要不说是赵哥让你们去的就好。)