单例模式的几种写法

Posted fangtingfei

tags:

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

1,饿汉式

类加载和初始化时即创建了实例,不存在线程安全问题。

 1 package single;
 2 
 3 /**
 4  * 饿汉式,类一加载直接创建好实例对象
 5  *
 6  * (1) 构造器私有化
 7  * (2) 自行创建,并且用静态变量保存
 8  * (3) 向外提供这个实例
 9  * (4) 强调这是一个单例,用static关键字修饰
10  */
11 public class Singleton1 {
12     public static final Singleton1 INSTANCE=new Singleton1();
13 
14     private Singleton1(){
15 
16     }
17 }

也可以采用枚举类的方式

 1 package single;
 2 
 3 /**
 4  * 使用枚举的方式设计单例模式
 5  * 枚举类型,表示该类型呢的对象是有限的几个
 6  * 限定为一个就成单例了
 7  *
 8  */
 9 public enum Singleton2 {
10     INSTANCE
11 }

如果要给实例传参:

 1 package single;
 2 
 3 /**
 4  * 可以给类传参的饿汉式写法,对第一种方法的改造
 5  */
 6 public class SingleTon3 {
 7     public static final SingleTon3 INSTANCE;
 8     private String info;
 9     private SingleTon3(String info){
10         this.info=info;
11     }
12 
13     static {
14         INSTANCE=new SingleTon3("传入参数");
15     }
16 }

2,懒汉式

需要实例的时候再创建,需要考虑线程安全问题

 1 package single;
 2 
 3 /**
 4  * 为解决多线程情况下的可能被创建多个实例的情况,在实例为空,创建第一个实例的时候加入synchronize同步锁
 5  */
 6 public class Singleton5 {
 7     private static Singleton5 INSTANCE;
 8     private Singleton5(){
 9 
10     }
11     public static Singleton5 getInstance(){
12         if(INSTANCE==null){
13             synchronized (Singleton5.class){
14                 //模拟多线程下的延时
15                 try {
16                     Thread.sleep(100);
17                 } catch (InterruptedException e) {
18                     e.printStackTrace();
19                 }
20                 INSTANCE=new Singleton5();
21             }
22         }
23         return INSTANCE;
24     }
25 }

使用内部类的懒汉式单例模式思路:

 1 package single;
 2 
 3 /**
 4  * 懒汉式的另一种思路,设计一个内部类,将实例的创建放在内部类的静态变量中,
 5  * 静态内部类相当于一个独立的类,使内部类被加载和初始化时才创建实例,因此不会存在线程安全问题
 6  */
 7 public class Singleton6 {
 8     private Singleton6(){
 9 
10     }
11     private static class Inner{
12         private static final Singleton6 INSTANCE=new Singleton6();
13     }
14     public static Singleton6 getInstance(){
15         return Inner.INSTANCE;
16     }
17 }

 

以上是关于单例模式的几种写法的主要内容,如果未能解决你的问题,请参考以下文章

单例模式的几种写法

设计模式之单例模式的几种写法——java

单例模式的几种写法的差异

单例模式的几种写法

单例模式的几种写法

单例模式:Java单例模式的几种写法及它们的优缺点