| packagesingleton;
 /**
  * @author lei
  * 單例模式的五種寫法:
  * 1、懶漢
  * 2、惡漢
  * 3、靜態(tài)內(nèi)部類
  * 4、枚舉
  * 5、雙重校驗(yàn)鎖
  * 2011-9-6
  */
 /**
  *五、 雙重校驗(yàn)鎖,在當(dāng)前的內(nèi)存模型中無效
  */
 classLockSingleton{
     privatevolatilestaticLockSingleton singleton;
     privateLockSingleton(){}
     
     //詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html
     publicstaticLockSingleton getInstance(){
         if(singleton==null){
             synchronized(LockSingleton.class){
                 if(singleton==null){
                     singleton=newLockSingleton();
                 }
             }
         }
         returnsingleton;
     }
     
 }
 /**
  * 四、枚舉,《Effective Java》作者推薦使用的方法,優(yōu)點(diǎn):不僅能避免多線程同步問題,而且還能防止反序列化重新創(chuàng)建新的對象
  */
 enumEnumSingleton{
     INSTANCE;
     publicvoiddoSomeThing(){
     }
 }
 /**
  * 三、靜態(tài)內(nèi)部類 優(yōu)點(diǎn):加載時不會初始化靜態(tài)變量INSTANCE,因?yàn)闆]有主動使用,達(dá)到Lazy loading
  */
 classInternalSingleton{
     privatestaticclassSingletonHolder{
         privatefinalstaticInternalSingleton INSTANCE=newInternalSingleton();
     }   
     privateInternalSingleton(){}
     publicstaticInternalSingleton getInstance(){
         returnSingletonHolder.INSTANCE;
     }
 }
 /**
  * 二、惡漢,缺點(diǎn):沒有達(dá)到lazy loading的效果
  */
 classHungrySingleton{
     privatestaticHungrySingleton singleton=newHungrySingleton();
     privateHungrySingleton(){}
     publicstaticHungrySingleton getInstance(){
         returnsingleton;
     }
 }
 /**
  * 一、懶漢,常用的寫法
  */
 classLazySingleton{
     privatestaticLazySingleton singleton;
     privateLazySingleton(){
     }
     publicstaticLazySingleton getInstance(){
         if(singleton==null){
             singleton=newLazySingleton();
         }
         returnsingleton;
     }   
 }
 |