java单例模式八种实现方式

Posted dreamjujujia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java单例模式八种实现方式相关的知识,希望对你有一定的参考价值。

饿汉式两种

懒汉式三种

双重检验

静态内部类

枚举

  • 一.饿汉式(两种)
    •  1.静态常量

 

 1 /**
 2  * @author 79282
 3  * 单列模式第一种 写法:饿汉式(静态常量)
 4  */
 5 public class Singleton01 {
 6     //私有化构造器
 7     private Singleton01() {
 8 
 9     }
10 
11     //私有静态常量
12     private static final Singleton01 INSTANCE = new Singleton01();
13 
14     //get方法
15     public static Singleton01 getInstance() {
16         return INSTANCE;
17     }
18 
19 }
20 class Test01{
21     public static void main(String[] args) {
22         Singleton01 instance01 = Singleton01.getInstance();
23         Singleton01 instance02 = Singleton01.getInstance();
24         System.out.println(instance01 == instance02);
25     }
26 
27 }
    • 2.静态代码块
 1 /**
 2  * @author 79282
 3  * 饿汉式 静态代码块
 4  */
 5 public class Singleton02 {
 6     //私有化构造器
 7     private Singleton02() {
 8 
 9     }
10 
11     private static Singleton02 instance;
12     //静态代码块
13     static{
14         instance = new Singleton02();
15     }
16 
17     public static Singleton02 getInstance() {
18         return instance;
19     }
20 }
21 class Test02{
22 
23     public static void main(String[] args) {
24         Singleton02 instance01 = Singleton02.getInstance();
25         Singleton02 instance02 = Singleton02.getInstance();
26         System.out.println(instance01 == instance02);
27     }
28 }
  • 二.懒汉式(三种).
    •   1.线程不安全 不推荐使用
 1 /**
 2  * @author 79282
 3  * 懒汉式 (线程不安全)不可用
 4  */
 5 public class Singleton03 {
 6     //私有化构造器
 7     private Singleton03() {
 8 
 9     }
10 
11     private static Singleton03 instance = null;
12 
13 
14     public static Singleton03 getInstance() {
15 
16         if (instance == null) {
17              instance = new Singleton03();
18         }
19         return instance;
20     }
21 
22 }
23 
24 class Test03 {
25     public static void main(String[] args) {
26         Singleton03 instance01 = Singleton03.getInstance();
27         Singleton03 instance02 = Singleton03.getInstance();
28         System.out.println(instance01 == instance02);
29     }
30 }
    •   2.线程安全的(使用同步方法) 不推荐使用
 1 /**
 2  * @author 79282
 3  * 懒汉式 线程安全的(使用同步方法) 不推荐使用
 4  */
 5 public class Singleton04 {
 6     //私有化构造器
 7     private Singleton04() {
 8 
 9     }
10 
11     private static Singleton04 instance = null;
12 
13     public static synchronized Singleton04 getInstance() {
14         if (instance == null) {
15             instance = new Singleton04();
16         }
17         return instance;
18     }
19 }
20 class Test04{
21     public static void main(String[] args) {
22         Singleton04 instance01 = Singleton04.getInstance();
23         Singleton04 instance02 = Singleton04.getInstance();
24         System.out.println(instance01 == instance02);
25     }
26 }
    •   3.使用同步代码块(线程安全)

  

 1 /**
 2  * @author 79282
 3  * 懒汉式 使用同步代码块 不可用
 4  */
 5 public class Singleton05 {
 6     private Singleton05() {
 7 
 8     }
 9 
10     private static Singleton05 instance = null;
11 
12     public static Singleton05 getInstance() {
13         if (instance == null) {
14             synchronized (Singleton05.class) {
15                 instance = new Singleton05();
16             }
17         }
18         return instance;
19     }
20 }
21 
22 class Test05{
23     public static void main(String[] args) {
24 
25         Singleton05 instance01 = Singleton05.getInstance();
26         Singleton05 instance02 = Singleton05.getInstance();
27         System.out.println(instance01 == instance02);
28 
29     }
30 }
  • 三.双重检查(推荐使用)
 1 /**
 2  * @author 79282
 3  * 懒汉式 双重检验(推荐使用)
 4  */
 5 public class Singleton06 {
 6     private Singleton06() {
 7 
 8     }
 9 
10     private static Singleton06 instance = null;
11     public static Singleton06 getInstance() {
12         if (instance == null) {
13             synchronized (Singleton06.class) {
14                 if (instance == null) {
15                     instance = new Singleton06();
16                 }
17 
18 
19             }
20         }
21 
22         return instance;
23     }
24 }
25 class Test06{
26     public static void main(String[] args) {
27         Singleton06 instance01 = Singleton06.getInstance();
28         Singleton06 instance02 = Singleton06.getInstance();
29         System.out.println(instance01 == instance02);
30     }
31 }
  • 四.使用静态内部类(推荐使用)
 1 /**
 2  * @author 79282
 3  * 静态内部类创建单例(推荐使用)
 4  */
 5 public class Singleton07 {
 6     private Singleton07() {
 7 
 8 
 9     }
10 
11     //私有静态内部类
12     private static class SingletonInstance{
13         private static final Singleton07 INSTANCE = new Singleton07();
14     }
15 
16     public static Singleton07 getInstance() {
17         return  SingletonInstance.INSTANCE;
18     }
19 
20 
21 }
22 class Test07{
23     public static void main(String[] args) {
24 
25         Singleton07 instance01 = Singleton07.getInstance();
26         Singleton07 instance02 = Singleton07.getInstance();
27         System.out.println(instance01 == instance02);
28     }
29 }
  • 五.使用枚举(推荐使用)
 1 /**
 2  * @author 79282
 3  * 使用枚举 (推荐使用)/
 4  */
 5 public enum Singleton08 {
 6 
 7     INSTANCE;
 8 
 9 }
10 class Test08{
11     public static void main(String[] args) {
12         Singleton08 instance01 = Singleton08.INSTANCE;
13         Singleton08 instance02 = Singleton08.INSTANCE;
14         System.out.println(instance01 == instance02);
15     }
16 
17 }

 

以上是关于java单例模式八种实现方式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式——单例模式八种方式

java单例设计模式八种方式

单例模式的八种写法

单例模式的八种写法比较

单例模式的八种写法比较

八种单例模式分析