1. 程式人生 > >淺談多執行緒中的懶漢式單例

淺談多執行緒中的懶漢式單例

1.場景:我們都知道在應用開發中有時會使用到單例設計模式,那麼今天我們就淺談一下單例中的一種-懶漢式。

顧名思義懶漢式其實是一個很有意思的名字,懶漢在我們開發中常說的用到了才去建立物件。此種生成方式遇到多執行緒又會擦出怎樣的火花呢?

public class Singleton{ 

       private Singleton(){} 

       private static Singleton singleton = null; //不建立物件

      public static synchronized Singleton getInstance(){ if(singleton == null) { //先判斷是否為空
                 singleton = new Singleton ();  //懶漢式做法 
             }
             return singleton ;
   }
}
public class testDemo {  public static void main(String[] args) {     myThread m = new myThread();   Thread s = new Thread(m);   Thread s1 = new Thread(m);   s.start();   s1.start();  }}
//如上圖所示:
詳細解析:
當執行緒呼叫獲取例項方法時呼叫同步的getInstance方法獲取例項,大家知道獲取鎖的同時會影響效率問題,那麼在此基礎上我們儘可能的提高效率,所以優化如下:
class signal{
 private static signal s;
 public signal(){}
 public static signal getInstance(){
  if( s == null){
   synchronized (signal.class) {
    if(s == null){
     s = new signal();
    }
   }
  }
  return s;
 }
}
如果實力不為空則直接返回該物件,從而一定程度上提高效率