前言
單例模式是寫代碼過程中不可避免用到的,下面我總結一下單例常用的五種寫法,話不多說了,來一起看看詳細的介紹吧
加載類時創建單例
Java實現
1
2
3
4
5
6
7
8
9
|
public class Config{ private static Config INSTANCE= new Config(); private Config(){ //構造函數 } public static Config getInstance(){ return INSTANCE; } } |
Kotlin實現
1
|
object Config{} |
上面這種寫法簡單粗暴,直接在加載類的時候創建,但這樣會拖慢啟動進程,因此,可以在用到的時候再加載,比如下面這種寫法
懶加載寫法
Java實現
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Config{ private static Config INSTANCE; private Config(){ //構造函數 } public static Config getInstance(){ if ( null ==INSTANCE){ INSTSANCE= new Config(); } return INSTANCE; } } |
Kotlin實現
1
2
3
4
5
6
7
|
public class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.NONE){ Config() } } } |
懶加載雖然避免在加載類的時候創建,但是線程不安全,如果同時多個類獲取單例,有可能會創建多個單例,因此可以在創建單例的時候加線程鎖,比如下面這種寫法:
同步鎖寫法
Java實現
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Config{ private static Config INSTANCE; private Config(){ //構造函數 } public static synchronized Config getInstance(){ if ( null ==INSTANCE){ INSTANCE= new Config(); } return INSTANCE; } } |
Kotlin實現
1
2
3
4
5
6
7
8
9
10
|
class Config{ companion object{ private var instance:Config?= null @Synchronized fun get():Config{ if (nnull==instance) instance=Config() return instance } } } |
同步鎖避免單例不會被重復創建,但是同步鎖
雙重校驗寫法
Java實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Config{ private static volatile Config INSTANCE; private Config(){ //構造函數 } public static Config getInstance(){ if ( null ==INSTANCE){ synchronized (Config. class ){ if ( null ==INSTANCE){ INSTSANCE= new Config(); } } } return INSTANCE; } } |
Kotlin實現
1
2
3
4
5
6
7
|
class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){ Config() } } } |
靜態內部類寫法
這種寫法避免了類加載的時候初始化單例,同時將同步鎖問題交給虛擬機處理,算得上是最優雅的寫法,Java和Kotlin寫法幾乎是一模一樣
Java實現
1
2
3
4
5
6
7
8
9
10
11
|
public class Config{ private static class Helper{ private static Config INSTANCE= new Config(); } private Config(){ //構造函數 } public static Config getInstance(){ return Helper.INSTANCE; } } |
Kotlin實現
1
2
3
4
5
6
7
8
|
class Config private constructor(){ companion object{ fun getInstance = Helper.instance } private object Helper{ val instance = Config() } } |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.jianshu.com/p/6dde590d253d