b站學習做的筆記
單例模式就是採取一定的方法保證整個軟體
統裡面對於某個類只能存在乙個例項
並且該類只提供乙個取物件例項的方法(靜態方法)
餓漢式(靜態常量)
餓漢式(靜態**塊)
懶漢式(執行緒不安全)
懶漢式(執行緒安全 同步方法)
雙重檢查
靜態內部類 列舉
餓漢式的兩種寫法
1靜態常量
步驟
1. 構造器私有化(防止new )
2. 類的內部建立物件
3. 向類的外面暴露乙個靜態的公共方法getinstance
4. **實現
package com.設計模式.單例模式;
public class singleton1
}//餓漢式(靜態常量)
class singleton
//內部建立例項
private final static singleton singleton = new singleton();
//提供返回方法
public static singleton getinstance()
}
325040804
325040804
hascode相同
優缺點
寫法簡單 在類載入的時候完成例項化。避免執行緒同步的問題
缺點:在類載入的時候完成例項化 沒有達到 lazy loading 的效果 如果從來沒有使用這個例項 就會造成記憶體的浪費
這種方法基於classloder 機制避免了多執行緒 的同步問題 在instance 在類載入時候就例項化 在單例中大多是呼叫getinstance方法 但是導致類裝置的原因有很多 不能確定有其他的方式導致類裝載 這時候初始化instance 沒有達到lazy loading的效果
4 結論:這種方法可能會導致記憶體浪費.
靜態**塊
package com.設計模式.單例模式;
public class test
}class singleton2
static
public static singleton2 getinstance()
}
優缺點 同上
懶漢式1 執行緒不安全
package com.設計模式.單例模式;
public class test2
}class singletontest
//提供乙個靜態方法 用到方法再去建立instance
public static singletontest getinstance()
return instance;
}}
優缺點
1.起到了lazy loading 的效但是只能在單執行緒下使用
2 多執行緒下 乙個執行緒進入if 判斷 還未來得及向下執行 另乙個執行緒也進去判斷 這樣會產生多個例項 (多執行緒下不可使用)
2 執行緒安全
public class test
}class singleton
//加入同步處理
public static synchronized singleton getinstance()
return instance;
}}
問題:
1 解決了執行緒不安全的問題
2 效率低了 執行緒要獲得例項的時候getinstance 都要同步
注: 如果在這使用同步**塊 起不到執行緒安全的作用
public class test
}class singleton
public static singleton getinstance()}}
return singleton;
}}//物件建立可能指令重排,建立空間,指向空間,然後才初始化,volatile可保證有序,可見
這裡必須加volalite的原因:
new 物件的過程分為三步:
1.分配空間
2.初始化物件
3.指向物件記憶體位址。2和3可能被編譯器自動重排,導致判斷非空但是實際拿的物件還未完成初始化
注: new 操作中初始化記憶體空間和指向 記憶體空間這兩步操
作會根據情況不同,執行順序不同,如果先
是指向記憶體空間執行,這時對
象不為空,另乙個執行緒有
可能進入並返回未初始化的物件
優缺點
1 double-check 保證執行緒的安全性
2 執行緒安全 延遲載入 效率較高
public class test
}class singleton
private static class singletoninstance
public static singleton getinstance()
}
1 使用了類裝載的機制保證初始化例項只有乙個執行緒
2靜態內部類在類被裝載時候並不會立即例項化 而是在
需要例項化的時候呼叫getinstance() 才會裝載內部類完成例項化
3 類的靜態屬性在第一次載入類的時候會初始化 jvm
幫助我們保護l執行緒安全
4 利用靜態內部類實現延遲載入 效率高
public class test
}enum singleton
}
避免多執行緒同步問題 還能防止反序列化重新建立新的物件 單例模式詳細案例
單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方法 比如hibernate的sessionfactory,它充當資料儲存源的 並負責建立session物件。sessionfactory並不是輕量級的,一般情況下,乙個...
詳細解說單例模式
public class singleton public static singleton getinstance public class singleton private singleton public static singleton getinstance 優點 在類裝載的時候就完成了...
php單例模式詳細介紹
1 單例模式的概念 單例模式是指整個應用中某個類只有乙個物件例項的設計模式。具體來說,作為物件的建立方式。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統全域性的提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回乙個引用。2 單例模式的特點 單例模式的主要特點是 三私一公...