在学习了多线程课程中关于单例模式部分后记录一些知识点。
常见的单例模式一:懒汉模式。
public class Singleton { private Singleton() { //初始化 } private static Singleton instance = null; public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
分析:在单线程中能保证创建唯一的实例。但是在多线程的情况下可能会出现错误。
错误原因:当A线程访问到1(if判断)时,CPU被线程B所占据此时instance还未初始化依旧为null。所以B线程创建了一个instance然后A也创建了一个instance。
测试代码:
public class ThreadA extends Thread { public void run(){ System.out.println(Singleton.getInstance().hashCode()); } public static void main(String[] args) { ThreadA t1 = new ThreadA(); ThreadA t2 = new ThreadA(); ThreadA t3 = new ThreadA(); t1.start(); t2.start(); t3.start(); } }
结果:1217036164、2140075580、2140075580
hashcode不相同证明不是同一个对象=》不是单例=》线程不安全