设计模式-单例模式的不同写法

package aa.singleton;

public class TestCase {
    
    
	public static void main(String[] args) {
    
    
		SingleDemo7 e1 = SingleDemo7.INSTANCE;
		SingleDemo7 e2 = SingleDemo7.INSTANCE;
		System.out.println(e1==e2);
	}
}
class SingleDemo{
    
    
	private SingleDemo() {
    
    }
	private static SingleDemo instance = new SingleDemo();
	public static SingleDemo getInstance() {
    
    
		return instance;
	}
}
class SingleDemo1{
    
    
	private SingleDemo1() {
    
    }
	private static SingleDemo1 instance ;
	static{
    
    
		instance = new SingleDemo1();
	}
	public static SingleDemo1 getInstance() {
    
    
		return instance;
	}
}
class SingleDemo2{
    
    
	private SingleDemo2() {
    
    }
	private static SingleDemo2 instance ;
	public static SingleDemo2 getInstance() {
    
    
		if(instance==null) {
    
    
			instance = new SingleDemo2();
		}
		return instance;
	}
}

class SingleDemo3{
    
    
	private SingleDemo3() {
    
    }
	private static SingleDemo3 instance ;
	public static synchronized SingleDemo3 getInstance() {
    
    
		if(instance==null) {
    
    
			instance = new SingleDemo3();
		}
		return instance;
	}
}

class SingleDemo4{
    
    
	private SingleDemo4() {
    
    }
	private static SingleDemo4 instance ;
	public static  SingleDemo4 getInstance() {
    
    
		synchronized (SingleDemo4.class) {
    
    
			if(instance==null) {
    
    
				instance = new SingleDemo4();
			}
		}
		return instance;
	}
}
class SingleDemo5{
    
    
	private SingleDemo5() {
    
    }
	private static volatile SingleDemo5 instance ;
	public static  SingleDemo5 getInstance() {
    
    
		if(instance==null) {
    
    
			synchronized (SingleDemo5.class) {
    
    
				if(instance==null) {
    
    
					instance = new SingleDemo5();
				}
			}
		}
		return instance;
	}
}
//1.这种方式采用了类加载的机制保证初始化实例时只有一个线程
//2.静态内部类方式在SingleDemo66被装载时不回被立即实例化,而是在需要的时候实例化,
//调用getinstance方法,才会被转载到SingleDemo6
//3.类的静态属性指挥在第一次加载类的时候实例化,所以这里jvm保证了线程的安全性,在类进行初始化时,别的线程无法进入
//4.线程安全
class SingleDemo6{
    
    
	private SingleDemo6() {
    
    }
	public static synchronized SingleDemo6 getInstance() {
    
    
		return SingleDemo66.INSTANCE;
	}
	private static class SingleDemo66 {
    
    
		private static final SingleDemo6 INSTANCE = new SingleDemo6();
	}
}
enum SingleDemo7{
    
    
	INSTANCE;
	public void test() {
    
    
		System.out.println("enum~");
	}
}



Guess you like

Origin blog.csdn.net/weixin_39472101/article/details/121437448