单例模式写法
饿汉式
public class Student1 {
// 2:成员变量初始化本身对象
private static Student1 student = new Student1();
// 构造私有
private Student1() {}
// 3:对外提供公共方法获取对象
public static Student1 getSingletonInstance() {
return student;
}
public void sayHello(String name) {
System.out.println("hello," + name);
}
}
懒汉式
静态内部类方式
package shejimoshi.singleton;
/**
* 静态内部类 单例模式
*/
public class InnerClassSingleton {
private InnerClassSingleton(){}
/**
* JVM在类加载时候是互斥的。
*/
public static class SingletonFactory {
private static InnerClassSingleton singleton = new InnerClassSingleton();
}
/**
* 获取实例
* @return
*/
public static InnerClassSingleton getSingleInstance() {
return SingletonFactory.singleton;
}
}
双重检测锁方式
原理可参考: https://www.cnblogs.com/xz816111/p/8470048.html
package shejimoshi.singleton;
/**
* 双重检查锁
*/
public class Singleton {
//volatile 修饰的变量不会进行指令重排序, volatile能保证可见性和有序性。
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}