标签:设计模式 问题 访问 线程 方法 nbsp 解决 原创 single
网上讲解单例模式的文章已经很多了,但是没有我的原创,所以要写一个.
单例模式是设计模式中的经典之一,主要的作用就是保证只有一个实例被创建.
单例模式分为饥汉模式和饱汉模式,饥汉模式是指在一开始就创建实例;饱汉模式是指在需要时才创建实例
以下是饱汉模式:
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 外层在判断一次实例是否被创建,通过双层检查的模式可以兼顾线程安全和性能.
标签:设计模式 问题 访问 线程 方法 nbsp 解决 原创 single
原文地址:https://www.cnblogs.com/blog-xiao/p/11795770.html