package model;
public class MySingleTon {
//1:饿汉 一旦完成加载,就把单例初始化完成,getInstance时已存在
// private final static MySingleTon singleTon=new MySingleTon();
//
// private MySingleTon(){
// System.out.println("starting init single");
// }
// public static MySingleTon getInstance(){
// return singleTon;
// }
//
// MySingleTon sinle1=MySingleTon.getInstance();
// System.out.println("-------------");
// MySingleTon sinle2=MySingleTon.getInstance();
// System.out.println("-------------");
// MySingleTon sinle3=MySingleTon.getInstance();
//
// 输出
// starting init single
// -------------
// -------------
//2 线程安全的 懒汉式 调用getInstance时 初始化实例
// private static MySingleTon single=null;
//
// private MySingleTon(){
//
// }
// public static MySingleTon getInstance(){
// if(single==null){
// synchronized (single) {
// if(single==null){
// single=new MySingleTon();
// }
// }
// }
// return single;
// }
//3 静态内部类实现单例
// 至于1、2、3这三种实现又有些区别,
//
// 第一种:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,
//
// 第2种,在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
//
// 第3种,利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。
private static class staticClassLazy{
private static MySingleTon single=new MySingleTon();
}
private MySingleTon(){}
public static MySingleTon getInstance(){
return staticClassLazy.single;
}
}