单例在多线程下的安全问题
public class SingetonDemo {
private static SingetonDemo instance = null;
public SingetonDemo(){
System.out.println(Thread.currentThread().getName() + "被创建出来了");
}
public static SingetonDemo getInstance(){
if(instance == null){
instance = new SingetonDemo();
}
return instance;
}
public static void main(String[] args) {
// /* 单例模式在单线程的情况下 */
// System.out.println(SingetonDemo.getInstance() == SingetonDemo.getInstance());
// System.out.println(SingetonDemo.getInstance() == SingetonDemo.getInstance());
// System.out.println(SingetonDemo.getInstance() == SingetonDemo.getInstance());
// /*
// * 单例模式在多线程的情况下
// * 情况一:
// * 主线程——》做循环操作
// * 子线程——》在主线程做循环操作时,cpu快速切换创建多个子线程,多个子线程同时争抢获取类资源,
// * 此时instance还为null,每个线程创建一次对象,造成单例情况下的安全问题
// *
// * */
// for (int i = 1; i <= 10; i++) {
// new Thread(() -> {
// SingetonDemo.getInstance();
// },String.valueOf(i)).start();
// }
// /*
// * 单例模式在多线程的情况下
// * 情况二:
// * 主线程——》做循环操作
// * 子线程——》在主线程做循环操作时,cpu快速切换创建多个子线程,但是由于设置了线程睡眠&