由於懶漢式的實現是線程安全的,因此會下降整個訪問速度,並且每次訪問都要判斷一次。有沒有更好的方式實現呢?能夠使用「雙重檢查枷鎖」的方式來實現。安全
所謂「雙重檢查加鎖」機制,是指並非每次靜茹getInstance方法都須要同步,而是先不一樣步。當進入方法後,先檢查實力是否存在,若是不存在才進行下面的同步塊,着是第一次檢查,進入同步代碼塊,再次檢查實力是否存在。若是不存在,就在同步的狀況下建立一個實例,這是第二重檢查。這樣一來,整個過程只須要一次同步,從而減小了屢次在同步狀況下進行判斷所浪費的時間。spa
public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { // 先檢查實例是否存在,若是不存在才進入下面的同步塊 if(instance == null) { // 同步塊,線程安全的建立實例 synchronized (Singleton.class) { // 再次檢查實例是否存在,若是不存在,才真正地建立實例 if (instance == null) { instance = new Singleton(); } } } return instance; } }