1.爲什麼用單例?
簡單來說就是全局共享一個對象,如果某對象初始化很麻煩也推薦用單例,只有一個情況下好管理,什麼配置類,Util包一般情況下最好都是單例
2.單例跟static關係
兩者有點像,static從理解是確實是“單例”,但是根本所處JVM區域不同,static只能在靜態方法區,單例對象還可以再堆裏,spring容器常見吧,這不就是一個最好的單例,JVM調優調的也主要是堆,靜態區以後少用。
3.懶漢餓漢
當做一種思維來理解
4.單例實現
一定要保證私有構造,我看網上很多人忘了寫這個,不私有構造,怎麼成單例?
是不是final也無所謂吧,我覺得加跟不加都行。
5.雙層鎖單例的實現
最外層的if是減少可能排隊的線程,貌似不加也行?不加的話可能會有更多的線程阻塞到裏面。
中間那層鎖是阻塞線程用的,目的是讓線程一個一個去創建。
裏面那層實際上比較重要,因爲阻塞的線程可能是多個,沒有這個判斷裏面的線程剛釋放鎖,外面的就立刻又創建一個了造成多次初始化會浪費。
//餓漢式
class SingleA {
public static SingleA singleA = new SingleA();
public static SingleA getSingle(){
return singleA;
}
private SingleA() {
}
}
//懶漢式
class SingleB{
public static SingleB singleB = null;
public static synchronized SingleB getSingleB(){
if(singleB==null){
singleB=new SingleB();
}
return singleB;
}
private SingleB() {
}
}
//靜態內部類
class SingleC{
public static class SingleCC{
public static SingleCC singleCC=new SingleCC();
}
public static SingleCC getSingelC(){
return SingleCC.singleCC;
}
private SingleC(){
}
}
//雙層鎖
class SingleD{
public static SingleD singleD = null;
public static SingleD getSingleD(){
if (singleD==null){
synchronized ("lock"){
if (singleD==null){
singleD=new SingleD();
}
}
}
return singleD;
}
private SingleD(){
}
}
class SingleE{
enum Color{
Name("顏色");
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
Color(String name) {
this.name = name;
}
}
public static void main(String[] args) {
}
}