网上讲解单例模式的文章已经很多了,但是没有我的原创,所以要写一个.
单例模式是设计模式中的经典之一,主要的作用就是保证只有一个实例被创建.
单例模式分为饥汉模式和饱汉模式,饥汉模式是指在一开始就创建实例;饱汉模式是指在需要时才创建实例
以下是饱汉模式:
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 public 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 外层在判断一次实例是否被创建,通过双层检查的模式可以兼顾线程安全和性能.