#### 1.靜態常量
####2.靜態**塊
#### 1.執行緒安全
####2.執行緒不安全(同步方法)
#### 3.執行緒不安全(同步**塊)
單例設計模式就是在整個系統中或者程式中只有乙個該物件的應用例項。例如:
public
class
single
public
static single getinstance()
}
<2>靜態**塊
–》步驟
1.宣告靜態私有的引用型別變數並用final修飾:private static final single instance;
2.建構函式私有化
3.提供靜態**塊並建立物件
4.提供公共的靜態方法
–》優點和缺點與靜態常量一樣
–》注意事項:
final修飾成員變數表示常量,必須進行初始化,否則報錯,初始化方式有兩種:一種是直接初始化;另一種是靜態**塊初始化。
–》**如下:
public
class
single
private
static single instance;
static
public
static single getinstance()
}
public
class
single
public
static single getinstance()
return instance;
}}
注意事項:**演示多執行緒情況下,該單例設計模式是執行緒不安全的*
public
static
void
main
(string[
] args)})
.start()
;}}
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2e739136
cn.xawl.design3.single@2e739136
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2542880d
cn.xawl.design3.single@2542880d
<2>執行緒安全(同步方法)
–》步驟:
1.宣告靜態私有的引用型別變數:private static single instance;
2.將建構函式私有化
3.提供公共的靜態方法並用synchornized修飾
–》優點:
實現了懶載入,在多執行緒的情況下是執行緒安全的
–》缺點:
synchornized修飾導致效率低,每一次都需要進行判斷只有第一次進行建立物件並return就好,之後直接return該物件就好。
–》**如下
*
public
class
single
public
static
synchronized single getinstance()
return instance;
}}
public
class
single
public
static single getinstance()
}return instance;
}}
–》步驟:
1.宣告靜態私有的引用型別變數:private static volatile single instance;
2.將建構函式私有化
3.提供公共的靜態方法,在該方法中使用同步**塊來同步
–》優點:
實現了懶載入,在多執行緒的情況下是執行緒安全的,效率高
–》分析 為什麼安全?為什麼使用volatile修飾?
假如乙個執行緒剛好執行了if判斷,還沒有執行synchronized,另乙個執行緒得到cpu執行權,執行if語句完成後,第乙個執行緒得到cpu的執行權,那麼還要進行第二次的if判斷,所以保證多執行緒的情況下,執行緒是安全的。
volatile修飾保證1.可見性 2.不能保證原子性 3.禁止指令重排,所以使用volatile是禁止 指令重排,如果第二個if和synchronized**編譯後指令重排,則可以導致執行緒不安全
–》**如下=
*
public
class
single
public
static single getinstance()
}}return instance;
}}
–》步驟:
1.宣告靜態私有的引用型別變數:private static single instance;
2.將建構函式私有化
3提供私有的靜態內部來建立物件
4.提供公共的靜態方法,獲取物件
–》優點:
實現了懶載入,在多執行緒的情況下是執行緒安全的,效率高
–》**如下=
public
class
single
private
static
class
singletool
public
static single getinstance()
}
–》步驟:
1.建立乙個列舉類
2.在instance成員變數
–》優點:
1.避免了執行緒安全問題
2.避免反序列化問題
–》**如下=
public
enum single
1.列舉類是乙個特殊的類
2.列舉值的預設修飾符號為public static final
3.列舉值所屬的型別是列舉值所屬類的資料型別,就是該類物件
4.編譯時,在靜態**塊中進行建立物件
5.列舉類的構造方法是private
6.列舉類是可以定義成員變數和成員方法的
7.列舉值必須位於列舉類的第一行,否則報錯
8.列舉類可以定義構造方法,但是必須為private
9.列舉類可以定義抽象方法,但是必須在列舉值中實現該方法。
1.系統記憶體中只存在乙個物件,節省了系統記憶體資源、比如頻繁建立物件、銷毀物件可以採用單例設計模式
2.當想例項化乙個物件時,是採用方法進行獲取,而不是new
3.單例設計模式使用的場景:需要頻繁建立物件和銷毀物件時,在建立物件需要耗時過多或者 或資源過多時,但又經常用到該物件(工具類、頻繁訪問資料庫或者檔案物件)可採用單例設計模式。
23種設計模式 單例模式(共八種)
所謂類的單例模式,就是採取一定的方法,保證在整個軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個獲得其物件例項的方法 靜態方法 當想例項化乙個單例類的時候,必須要使用相應的獲取物件的方法,而不是使用new。單例模式使用場景 需要頻繁的進行建立和銷毀物件 建立物件時耗時過多或耗費資源過多 ...
單例設計模式的八種方式
餓漢式 靜態常量 class singleton private final static singleton instance newsingleton public static singleton getinstance 優點 類載入的時候就完成例項化,避免了執行緒同步的問題 不足 沒有懶載入...
八種單例模式總結
先吐槽一下,這是誰起的名字,別說,還挺難聽。餓漢式1 2 靜態常量和靜態 塊 優點 這種寫法比較簡單,就是在類裝載的時候就完成例項化,避免了執行緒同步問題。缺點 在類裝載的時候就完成例項化,如果未使用過這個例項,會造成記憶體的浪費。public class singleton public stat...