设计模式之单例模式

网上讲解单例模式的文章已经很多了,但是没有我的原创,所以要写一个.

单例模式是设计模式中的经典之一,主要的作用就是保证只有一个实例被创建.

单例模式分为饥汉模式和饱汉模式,饥汉模式是指在一开始就创建实例;饱汉模式是指在需要时才创建实例

以下是饱汉模式:

 1 public class SingleTon {
 2     public static SingleTon instance = null;
 3     
 4     public SingleTon(){};
 5     
 6     public static SingleTon getInstance() {
 7         if(instance == null) {
 8             instance = new SingleTon();
 9         }
10         return instance;
11     }
12     
13 }

饥汉模式:

1 public class SingleTon {
2     public SingleTon(){};
3     private static SingleTon instance = new SingleTon();
4     public static SingleTon getInstance() {
5         return instance;
6     }
7 }

总结来说:创建单例模式主要有两个个步骤:

1.构造方法私有化

2.提供返回实例的静态方法

在单线程环境下这样创建单例模式是没有问题的,但是在多线程环境下可能就不能保证只创建一个实例.针对饱汉模式解决办法如下:

1 synchronized (SingleTon.class) {
2             if(instance == null) {
3                 instance = new SingleTon();
4             }
5         }

即在创建实例外层加上synchronized 模块,保证在同一时间只有一个线程能访问创建实例的方法,但是也会有影响效率的问题,为了避免每次到这个方法时造成线程排队,所以可以进一步优化:双重检查

1 if(instance == null) {
2             synchronized (SingleTon.class) {
3                 if(instance == null) {
4                     instance = new SingleTon();
5                 }
6             }
7         }

在synchronized 外层在判断一次实例是否被创建,通过双层检查的模式可以兼顾线程安全和性能.

 

posted @ 2019-11-04 23:33  程序至上  阅读(124)  评论(0编辑  收藏  举报