单例模式常见的几种方法
饿汉式
//饿汉式
private final static SingletonPattern singletonPattern = new SingletonPattern();
private SingletonPattern() {
System.out.println("调用了构造方法~~~~");
}
public static SingletonPattern getInstance() {
return singletonPattern;
}
public static void main(String[] args) {
System.out.println(SingletonPattern.getInstance());
System.out.println(SingletonPattern.getInstance());
}
输出结果:
使用懒汉式调用了构造方法~~~~
cn.edu.设计模式.SingletonPattern@1540e19d
cn.edu.设计模式.SingletonPattern@1540e19d
懒汉式DCL
//懒汉式DCL
private static volatile SingletonPattern singletonPattern=null;
private SingletonPattern() {
System.out.println("使用懒汉式DCL调用了构造方法~~~~");
}
public static SingletonPattern getInstance() {
if (singletonPattern==null){
synchronized (SingletonPattern.class){
if (singletonPattern==null){
singletonPattern=new SingletonPattern();
}
}
}
return singletonPattern;
}
public static void main(String[] args) {
System.out.println(SingletonPattern.getInstance());
System.out.println(SingletonPattern.getInstance());
}
输出结果:
使用懒汉式DCL调用了构造方法~~~~
cn.edu.设计模式.SingletonPattern@1540e19d
cn.edu.设计模式.SingletonPattern@1540e19d
volatile的作用:
懒汉式内部类
//懒汉式匿名内部类
public static class GetSingletonPattern{
private final static SingletonPattern singletonPattern = new SingletonPattern();
}
private SingletonPattern() {
System.out.println("使用懒汉式匿名内部类调用了构造方法~~~~");
}
public static SingletonPattern getInstance() {
return GetSingletonPattern.singletonPattern;
}
public static void main(String[] args) {
System.out.println(SingletonPattern.getInstance());
System.out.println(SingletonPattern.getInstance());
}
输出结果:
使用懒汉式匿名内部类调用了构造方法~~~~
cn.edu.设计模式.SingletonPattern@1540e19d
cn.edu.设计模式.SingletonPattern@1540e19d
ps: 会受到反射,序列化,unsafe()的影响破坏单例