單例模式的7種實現方式

2021-09-25 10:25:39 字數 2311 閱讀 9007

多個執行緒要操作同乙個物件,保證物件的唯一性,例項化過程只例項化一次;

解決的思路

在載入類時就例項化乙個物件

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...