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 靜態內部類實現單例
// 至於一、二、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;
} 性能
}線程