1 2懶漢模式及其問題 靜態內部類實現單例模式

2021-09-19 08:04:29 字數 2314 閱讀 6403

懶漢模式**

package singleton;

public class lazysingleton

public static lazysingleton getinstance()

public static void main(string args)

}

懶漢模式最主要得就是會在多執行緒中重複建立 物件例項,若執行緒較多則會導致記憶體使用過大,甚至導致程式崩潰。測試**如下

test**:

package singleton;

public class test

}

實習runnable介面**如下

package singleton;

public class t implements runnable

public static void main(string args)

}

雖然執行之後,結果輸出得 例項 是同乙個例項,但是這個結果是不確定得,也有可能會輸出多個例項。即便輸出同乙個物件例項,但是中間會多次建立物件例項,後乙個覆蓋前乙個物件,會造成記憶體資源的消耗,所以懶漢模式是一種不可取的方式。

解決方法:利用synchronized加到方法上,鎖住這個類

package singleton;

public class lazysingleton

public synchronized static lazysingleton getinstance()

//下面這個形式和上面的是一樣的,都是將這個類加了鎖,同一時間只允許乙個執行緒訪問這個類

// public static lazysingleton getinstance()

// return lazysingleton;

// }

public static void main(string args)

}

注意:多執行緒debug,要切換斷點設定為thread模式下,不能是all模式下,thread模式下,每個執行緒的斷點都可以真的起到作用,但是all模式下,只能斷到主線程的斷點。

直接將synchronized加在方法上,開銷較大,因此我們使用doublecheck方式,**如下

package singleton;

public class lazydoublechecksingleton

public static lazydoublechecksingleton getinstance()

} return lazydoublechecksingleton; }

public static void main(string args)

}

有了雙重檢查後,當進入方法,判斷lazydoublechecksingleton是否為null,當不為null時,直接返回lazydoublechecksingleton即可,就省去了鎖開銷。但是仍有隱患,如下圖

步驟2 3在單執行緒中允許重排序,所以出現上圖問題。

改進措施(解決重排序):將成員變數lazydoublechecksingleton加上volatile修飾符,使其寫操作具有可見性。(volatile的組合語言多了一些**,就是在寫操作後使這個記憶體物件的快取無效,當再需要用時,需要再從系統記憶體中讀到處理器的快取裡,即可見性)

private volatile static lazydoublechecksingleton lazydoublechecksingleton=null;
基於類初始化的延遲載入:靜態內部類原理:外部類載入時,不一定載入內部類,內部類不載入則不會去初始化instance,故而不占用記憶體,只有當getinstance()方法第一次被呼叫時,才會去初始化instance,延遲了單例的例項化,也使得執行緒安全,**如下

package singleton;

public class staticinnerclasssingleton

private static class innerclss

public staticinnerclasssingleton getinstance()

public static void main(string args)

}

存在隱患:靜態內部類無法傳參

單例模式 靜態內部類

靜態內部類是乙個很好的實現單例的方式 看 package cn.liz.syn public class staticinner 私有的靜態內部類 private static class inner 公共的 獲取例項的方法 public static staticinner getinstance...

單例模式 靜態內部類

1 2 單例模式 靜態內部類3 4public class singletontest0711 1213 14 靜態內部類實現方式 15 16class singleton 2324 25 2.寫乙個靜態內部類,直接返回singleton 26 27private static class sing...

Java靜態內部類單例模式

singleton是眾多設計模式中最容易理解的一種,也是眾多設計模式中較為重要的一種設計模式。singleton模式實現的重點在於將建構函式私有化 private 並通過提供靜態公有函式 public synchronized static getinstance 來獲取定義在類中的靜態私有成員 p...