饿汉模式
/**
* 单例模式-饿汉模式
* 饿汉要素
* 1 私有化构造方法
* 2 实例为静态变量
* 3 类初始化的时候实例化变量,通过jvm 一个类只能被初始化一次来保证单例
* 4 final 禁止指令重排序,防止因为并发高因为指令重排序导致的实例返回为null
*/
public class SingletonHungry {
private static final SingletonHungry instance = new SingletonHungry();
private SingletonHungry() {
}
public void m() {
System.out.println("单例想要做的m");
}
public static SingletonHungry getInstance() {
return instance;
}
public static void main(String[] args) {
SingletonHungry instance = SingletonHungry.getInstance();
SingletonHungry instance1 = SingletonHungry.getInstance();
System.out.println(instance.hashCode() == instance1.hashCode());
}
}
懒汉模式
/**
* 单例模式-懒汉模式
* 懒汉要素
* 1 私有化构造方法
* 2 实例为静态变量
* 3 用到该变量的时候会被初始化
* 4 volatile 禁止指令重排序 与饿汉的 final 有一曲同工之妙
*/
public class SingletonLazy {
private static volatile SingletonLazy instance;
private SingletonLazy() {
}
public void m() {
System.out.println("单例想要做的m");
}
public static SingletonLazy getInstance() {
if (null == instance) {
synchronized (SingletonLazy.class) {
if (null == instance) {
instance = new SingletonLazy();
}
}
}
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 200; i++) {
new Thread(() -> {
SingletonLazy instance = SingletonLazy.getInstance();
System.out.println(instance.hashCode());
}).start();
}
}
}
枚举模式
/**
* 单例模式-枚举
* 要素:
* 1 枚举中只有一个变量
*/
public enum SingletonEnum {
INSTANCE;
public void m() {
System.out.println("单例想要做的m");
}
public static void main(String[] args) {
for (int i = 0; i < 200; i++) {
new Thread(() -> {
SingletonEnum instance = SingletonEnum.INSTANCE;
instance.m();
System.out.println(instance.hashCode());
}).start();
}
}
}