JAva単例モード5種類の書き方
16702 ワード
学習整理
満腹モード(怠け者モード)
利点:怠惰なロードの起動が速く、リソースの占有量が小さく、使用時にインスタンス化され、ロックがありません.
欠点:非スレッドセキュリティ.
満腹モード(怠け者モード)--スレッドセキュリティ
長所:同じですが、鍵がかかっています.
欠点:synchronizedは排他ロックであり、パフォーマンスが悪い.インスタンスの取得は、作成に成功してもシリアル化されます.
満腹モード(怠け者モード)--二重ロック検査DCL(Double Check Lock)
利点:怠け者で、スレッドが安全です.
注意:インスタンスには volatileキーワード修飾は、初期化が完全であることを保証します.
餓漢モード
利点:餓漢モードは生まれつきスレッドが安全で、使用時に遅延がない.
欠点:起動時にインスタンスが作成され、起動が遅く、リソースが浪費される可能性があります.
Holderモード
利点:怠惰なロードとスレッドを安全に完璧に結合する方法(ロックなし).(推奨)
コメント:
1.グローバル共有、独一部;
2.構造関数は暴露しない(暴露すれば1部を保証できない)、自分で自分の構造を担当する.
3.怠け者式:Lazy load、使用してからロードし、スレッドではなく安全です.スレッドのセキュリティを保証する方法:
(1) synchronized getInstance().
(2)二重検査ロック(volatile).
4.餓漢式:最初から申請して、資源を浪費したが、スレッドは安全だ.
5.Holderモード:
(1)内部クラスに変更し,JVMによりスレッドセキュリティを保証する.
転載先:https://www.cnblogs.com/t0000/p/8250686.html
満腹モード(怠け者モード)
1 //
2 // UnThreadSafe
3 public class Singleton1 {
4 private static Singleton1 singleton = null;
5 private Singleton1() {
6 }
7 public static Singleton1 getInstance() {
8 if (singleton == null) {
9 singleton = new Singleton1();
10 }
11 return singleton;
12 }
13 }
利点:怠惰なロードの起動が速く、リソースの占有量が小さく、使用時にインスタンス化され、ロックがありません.
欠点:非スレッドセキュリティ.
満腹モード(怠け者モード)--スレッドセキュリティ
1 public class Singleton {
2
3 /**
4 *
5 */
6
7 private static Singleton uniqueInstance = null;
8
9 /**
10 * ,
11 */
12
13 private Singleton(){
14 }
15
16 /**
17 *
18 * @return Singleton
19 */
20
21 public static synchronized Singleton getInstance(){
22
23 //
24 if(uniqueInstance == null){
25 // , ,
26 uniqueInstance = new Singleton();
27 }
28
29 // ,
30 return uniqueInstance;
31 }
32
33 /**
34 * ,
35 */
36
37 public void singletonOperation(){
38
39 //
40
41 }
42
43 /**
44 * ,
45 */
46
47 private String singletonData;
48
49 /**
50 * ,
51 * @return
52 */
53
54 public String getSingletonData(){
55
56 return singletonData;
57
58 }
59
60 }
長所:同じですが、鍵がかかっています.
欠点:synchronizedは排他ロックであり、パフォーマンスが悪い.インスタンスの取得は、作成に成功してもシリアル化されます.
満腹モード(怠け者モード)--二重ロック検査DCL(Double Check Lock)
1 public class Singleton {
2
3 /**
4 * volatile
5 */
6
7 private volatile static Singleton instance = null;
8
9 private Singleton(){
10
11 }
12
13 public static Singleton getInstance(){
14
15 // ,
16
17 if(instance == null){
18
19 // ,
20
21 synchronized(Singleton.class){
22
23 // ,
24
25 if(instance == null){
26
27 instance = new Singleton();
28
29 }
30
31 }
32
33 }
34
35 return instance;
36
37 }
38
39 }
利点:怠け者で、スレッドが安全です.
注意:インスタンスには volatileキーワード修飾は、初期化が完全であることを保証します.
餓漢モード
1 public class Singleton {
2
3 //4:
4
5 // ,
6
7 private static Singleton instance = new Singleton();
8
9 //1: ,
10
11 private Singleton(){
12
13 }
14
15 //2:
16
17 //3: , static
18
19 //
20
21 public static Singleton getInstance(){
22
23 //5:
24
25 return instance;
26
27 }
28
29 }
利点:餓漢モードは生まれつきスレッドが安全で、使用時に遅延がない.
欠点:起動時にインスタンスが作成され、起動が遅く、リソースが浪費される可能性があります.
Holderモード
1 public class Singleton {
2 /**
3 * , ,
4 * , ,
5 */
6 private static class SingletonHolder{
7 /**
8 * , JVM
9 */
10 private static Singleton instance = new Singleton();
11 }
12 /**
13 *
14 */
15 private Singleton(){
16 }
17 public static Singleton getInstance(){
18 return SingletonHolder.instance;
19 }
20 }
利点:怠惰なロードとスレッドを安全に完璧に結合する方法(ロックなし).(推奨)
コメント:
1.グローバル共有、独一部;
2.構造関数は暴露しない(暴露すれば1部を保証できない)、自分で自分の構造を担当する.
3.怠け者式:Lazy load、使用してからロードし、スレッドではなく安全です.スレッドのセキュリティを保証する方法:
(1) synchronized getInstance().
(2)二重検査ロック(volatile).
4.餓漢式:最初から申請して、資源を浪費したが、スレッドは安全だ.
5.Holderモード:
(1)内部クラスに変更し,JVMによりスレッドセキュリティを保証する.
転載先:https://www.cnblogs.com/t0000/p/8250686.html