懶漢模式**
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...