多個執行緒要操作同乙個物件,保證物件的唯一性,例項化過程只例項化一次;
解決的思路
在載入類時就例項化乙個物件
public
class
singleton1
public
static singleton1 getintance()
}
特點用這個物件的時候才去例項化
public
class
hoonsingleton
public
static hoonsingleton getintance()
throws interruptedexception
return hoonsingleton;
}}
public
class
hoonsingleton
public
static hoonsingleton getintance()
throws interruptedexception
return hoonsingleton;
}public
static
void
main
(string[
] args)
catch
(interruptedexception e)
system.out.
println
(intance);}
}).start()
;}}}
可以看到例項化出了多個物件
將例項化過程放到同步方法中
public
class
hoonsingleton
public
synchronized
static hoonsingleton getintance()
throws interruptedexception
return hoonsingleton;
}}
保證每次第一次例項化只有乙個執行緒執行,後面的執行緒不執行;但是這樣鎖的粒度太粗了,退化成了序列執行;
減小鎖的粒度
public
class
hoondoublesyncsingleton
public
static hoondoublesyncsingleton getintance()
throws interruptedexception }}
return hoonsingleton;
}
保證了單例,但是沒***指令重排序所帶來的問題;
偽**:
public
class
hoondoublesyncsingleton
public
static hoondoublesyncsingleton getintance()
throws interruptedexception }}
return hoonsingleton;
}
如果發生指令重排序,即先建立物件,然後再建立連線,如果這時物件需要使用連線,則會出現空指標異常。
解決方法
用volatile修飾物件,記憶體屏障保證在建立物件前先建立連線。
宣告類的時候,成員變數中不生命例項變數,而放到靜態內部類中;
public
class
holderdemo
public
static holderdemo getinstance()
}
只有當呼叫getinstance方法時,才開始載入靜態內部類,開始例項化物件,保證了懶載入;而且靜態類被存放在方法區,所以物件只有乙個而且在共享資料區。
public
class
eumsingleton
}public
static eumsingleton getinstance()
}
7種方式實現單例模式
單例模式,即是整個類有且只有乙個類例項,通過這個唯一的例項為全域性提供服務。單例類的構造方法為私有的,通過乙個暴露給外界的獲取例項方法來呼叫私有構造方法,保證例項的唯一性。因為餓漢式單例在類載入時就初始化了唯一的例項 且只會初始化一次,所以,該例項是唯一的,即 執行緒安全的 因此,如果我們想要為例項...
單例模式的7種實現方式及比較
多個執行緒要操作同一物件,需要保證物件的唯一性。為了更好的對下面即將介紹的幾種實現方式進行比較,我們定義幾個考量維度 執行緒的安全線 是否懶載入 效能。方法一 餓漢式單例模式 可用 public class badmashsingleton public static badmashsingleto...
單例模式(5種實現方式)
1.餓漢式 不支援併發 此模式只能執行在單執行緒下,且類在載入時就已經建立好了例項,不管需不需要用。package com.lys 餓漢式 public class singleton1 private static singleton1 instance new singleton1 public...