概念:
单例模式是一种对象创建模式,确保系统中一个类只产生一个实例。
恶汉模式
public class RxjavaDome5 {
private static final RxjavaDome5 rxJava = new RxjavaDome5();
private RxjavaDome5() {
System.out.print("________");
}
public static RxjavaDome5 getRxJava() {
return rxJava;
}
public static void text(){
System.out.print("text");
}
public static void main(String[] args){
RxjavaDome5.text();
}
}
输出:________text
不足:构造不能延迟加载
懒汉模式
public class RxjavaDome5 {
private static RxjavaDome5 rxJava;
private RxjavaDome5() {
System.out.print("______");
}
public static RxjavaDome5 getRxJava() {
if (rxJava == null)
rxJava = new RxjavaDome5();
return rxJava;
}
public static void text(){
System.out.print("text");
}
public static void main(String[] args) {
RxjavaDome5.text();
}
}
输出:text
不足:并发失效
懒汉线程安全
public static synchronized RxjavaDome5 getRxJava() {
if (rxJava == null)
rxJava = new RxjavaDome5();
return rxJava;
}
或者
public static RxjavaDome5 getRxJava() {
synchronized (RxjavaDome5.class) {
if (rxJava == null)
rxJava = new RxjavaDome5();
}
return rxJava;
}
不足:性能不足
双重校验锁
public class RxjavaDome5 {
private static volatile RxjavaDome5 rxJava;
private RxjavaDome5() {
System.out.print("______ \n");
}
public static RxjavaDome5 getRxJava() {
if (rxJava == null)
synchronized (RxjavaDome5.class) {
if (rxJava == null)
rxJava = new RxjavaDome5();
}
return rxJava;
}
public static void text() {
System.out.print("text \n");
}
public static void main(String[] args) {
RxjavaDome5.text();
}
}
不足:JVM的即时编译器中存在指令重排序优化
静态内部类
public class RxjavaDome5 {
private static class SingleHolder {
public static final RxjavaDome5 rxjavaDome5 = new RxjavaDome5();
}
private RxjavaDome5() {
}
public static RxjavaDome5 getRxjava() {
return SingleHolder.rxjavaDome5;
}
}
优点:JVM本身机制保证了线程安全/没有性能缺陷
枚举
public enum RxjavaDome5 {
INSTANCE;
}
优点:写法简单/线程安全