}; Thread thread1 = new Thread(runnable); Thread thread2 = new Thread(runnable2); thread1.start(); thread2.start(); /** * 结果并不唯一, * 可能会出现相同,也有可能不同,多测几次,就能发现是线程不安全的。 * 94433 * 21648409 */ }
}
/**
*/
class Singleton {
/*** 构造器私有化*/ private Singleton() {} /*** 在类的内部创建一个对象实例 随当前类加载而加载 没有线程安全问题。*/ private static Singleton singleton; /** * 提供一个公有的方法 * 当使用到这个方法时,才去创建singleton */ public static Singleton getInstance() { if(singleton==null){ // 通过在这里堵赛的方式来模拟多线程 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } singleton= new Singleton(); } return singleton; }
}
结论及优缺: 1. 优点:起到了懒加载的效果 2. 缺点:线程不安全,如果在多线程下,第一个线程进入到`if(singleton==null)`下,但还未来的及执行,第二个线程就紧随而来也进入了`if(singleton==null)`下,那么就会创建多个实例。就不是单例模式了。 3. 建议:开发不要使用这种方式,线程安全问题不能解决,就是