前几种你也许见过,但是最后一种你搜完百度前20页也不一定有。^.^
目录
1. 懒汉式
public class SingletonHodey{
private volatile static SingletonHodey instance = new SingletonHodey();
private SingletonHodey(){}
public static SingletonHodey getInstance(){
return instance;
}
private Object readResolve(){
return instance;
}
public static void main(String[] args) {
SingletonHodey singletonHodey1 = SingletonHodey.getInstance();
SingletonHodey singletonHodey2 = SingletonHodey.getInstance();
System.out.println(singletonHodey1);
System.out.println(singletonHodey2);
}
}
运行结果:
com.Hodey.learn.bean.SingletonHodey@4f023edb
com.Hodey.learn.bean.SingletonHodey@4f023edb
2. 饿汉式
public class SingletonHodey{
private volatile static SingletonHodey instance = null;
private SingletonHodey(){}
public static SingletonHodey getInstance(){
if(null == instance){
synchronized(SingletonHodey.class){
if(null == instance){
instance = new SingletonHodey();
}
}
}
return instance;
}
private Object readResolve(){
return instance;
}
public static void main(String[] args) {
SingletonHodey singletonHodey1 = SingletonHodey.getInstance();
SingletonHodey singletonHodey2 = SingletonHodey.getInstance();
System.out.println(singletonHodey1);
System.out.println(singletonHodey2);
}
}
运行结果:
com.Hodey.learn.bean.SingletonHodey@4f023edb
com.Hodey.learn.bean.SingletonHodey@4f023edb
3. 静态内部类(痴汉式)
public class SingletonHodey{
private SingletonHodey(){}
private static class InternalSingletonHodey{
private static SingletonHodey instance = new SingletonHodey();
private Object readResolve(){
return instance;
}
}
public static SingletonHodey getInstance(){
return InternalSingletonHodey.instance;
}
public static void main(String[] args) {
SingletonHodey singletonHodey1 = SingletonHodey.getInstance();
SingletonHodey singletonHodey2 = SingletonHodey.getInstance();
System.out.println(singletonHodey1);
System.out.println(singletonHodey2);
}
}
执行结果:
com.Hodey.learn.bean.SingletonHodey@4f023edb
com.Hodey.learn.bean.SingletonHodey@4f023edb
5. 枚举
枚举天然支持序列化,所以不用加readResolve()方法。
5.1 枚举单例饿汉式
public class SingletonHodey{
private SingletonHodey(){}
private enum SingletonHodeyEnum{
INSTANCE;
private SingletonHodey instance = new SingletonHodey();
}
public static SingletonHodey getInstance(){
return SingletonHodeyEnum.INSTANCE.instance;
}
public static void main(String[] args) {
SingletonHodey singletonHodey1 = SingletonHodey.getInstance();
SingletonHodey singletonHodey2 = SingletonHodey.getInstance();
System.out.println(singletonHodey1);
System.out.println(singletonHodey2);
}
}
执行结果:
com.Hodey.learn.bean.SingletonHodey@4f023edb
com.Hodey.learn.bean.SingletonHodey@4f023edb
5.2 枚举单例懒汉式
public class SingletonHodey {
private enum SingletonHodeyEnum{
INSTANCE;
private SingletonHodey instance;
SingletonHodeyEnum(){
instance = new SingletonHodey();
}
}
private SingletonHodey(){}
public static SingletonHodey getInstance(){
return SingletonHodeyEnum.INSTANCE.instance;
}
public static void main(String[] args) {
SingletonHodey singletonHodey1 = SingletonHodey.getInstance();
SingletonHodey singletonHodey2 = SingletonHodey.getInstance();
System.out.println(singletonHodey1);
System.out.println(singletonHodey2);
}
}
执行结果:
com.Hodey.learn.bean.SingletonHodey@4f023edb
com.Hodey.learn.bean.SingletonHodey@4f023edb