懶漢:在初始化類的時候,不建立唯一的執行個體,而是等到真正需要用到的時候才建立。必須加上同步,否則有可能依然建立多個執行個體。
餓漢:在初始化的時候,就建立了唯一的執行個體,不管是否需要用到。不需要自己加同步,一定産生唯一的執行個體。
餓漢式
//餓漢式----類加載的時候就把自己的私有的、靜态的成員儲存唯一的執行個體建立出來了
public class Simple {
private Simple() {}//私有的構造方法 表示該類不能new出來
private static Simple simple=new Simple(); // 私有的、靜态的成員儲存唯一的執行個體
public static Simple getSimple() //通過靜态的方法來傳回上面建立時唯一執行個體
{
return simple;
}
}
飽漢式
//飽漢式----在方法調用的時候的時候就把自己的私有的、靜态的成員儲存唯一的執行個體建立出來了
public class Simple {
private Simple() {}//私有的構造方法 表示該類不能new出來
private static Simple simple; // 私有的、靜态的成員儲存唯一的執行個體
public static Simple getSimple() //通過靜态的方法來傳回上面建立時唯一執行個體
{
if (simple==null) {//判斷 執行個體是否為空
simple =new Simple();//這樣的建立方法可能會導緻線程不安全建立的出多個執行個體
}
return simple;
}
}
雙重校驗鎖
//雙重校驗鎖
public class Simple {
private Simple() {}//私有的構造方法 表示該類不能new出來
private static volatile Simple simple; // volatile 關鍵字保證執行個體的在jvm中不會重排序
public static Simple getSimple() //通過靜态的方法來傳回上面建立時唯一執行個體
{
synchronized (Simple.class) {//synchronized 表示給改對象加鎖 一個線程在操作的另外一個不會進來
if (simple == null) {//判斷 執行個體是否為空
simple = new Simple();
}
}
return simple;
}
}