线程安全的"懒汉"单例模式
2018-02-27 17:00
465 查看
所谓线程不安全实际上就是一段代码在同一时间被两个线程同时执行,导致运行结果与单个线程运行结果不相同
新建一个单例模式类和一个多线程测试类
执行后发现控制台打印了两个不同的对象:
说明有线程并发访问安全问题,获取的不是同一个实例
解决方案(1):使用同步锁机制,最简单的是在getInstance()方法上加synchronized关键字
对于这种方式,有人觉得在多并发的情况下,每次获取实例都要判断锁,效率比较低下,所以就有人想出了这样的办法,双重判断实例,这种大大减少判断同步锁的次数了。所以实际使用中可以推广。
解决方案(2):改懒汉式单例为饿汉式单例
新建一个单例模式类和一个多线程测试类
public class TestSingleTon implements Runnable{ public static void main(String[] args) { TestSingleTon t1 = new TestSingleTon(); TestSingleTon t2 = new TestSingleTon(); Thread thread1 = new Thread(t1); Thread thread2 = new Thread(t2); thread1.start(); thread2.start(); } @Override public void run() { System.out.println(SingleTon.getInstance()); } } public class SingleTon { private static SingleTon singleTon; public static SingleTon getInstance() { if(singleTon==null) { singleTon = new SingleTon(); } return singleTon; } }
执行后发现控制台打印了两个不同的对象:
com.wey.demo.SingleTon@22896964 com.wey.demo.SingleTon@1ac5e970
说明有线程并发访问安全问题,获取的不是同一个实例
解决方案(1):使用同步锁机制,最简单的是在getInstance()方法上加synchronized关键字
public synchronized static SingleTon getInstance() { if(singleTon==null) { singleTon = new SingleTon(); } return singleTon; }
对于这种方式,有人觉得在多并发的情况下,每次获取实例都要判断锁,效率比较低下,所以就有人想出了这样的办法,双重判断实例,这种大大减少判断同步锁的次数了。所以实际使用中可以推广。
public static SingleTon getInstance() { if(singleTon==null) { synchronized (SingleTon.class) {//SingleTon的字节码 if(singleTon==null) { singleTon = new SingleTon(); } } } return singleTon; }
解决方案(2):改懒汉式单例为饿汉式单例
public class SingleTon { private static SingleTon singleTon = new SingleTon(); public static SingleTon getInstance() { return singleTon; } }
相关文章推荐
- 关闭我们的"等死模式"
- 单例模式之懒汉模式的线程安全解决方法
- 解决多线程下单例模式中"懒汉模式"(延迟加载)的问题
- 六、vault - 开发模式 "Dev" Server Mode
- 理解关系数据库中的"模式/架构"
- "类工厂模式"改写SqlHelper
- IE的"Kiosk"模式(你想要的啥都没有的全屏)
- 启用Windows 7中的"God Mode"模式
- 模式应用 - 利用工厂模式制作自己的"小程序测试工厂"
- "心智模式"系列:如何面对逆境?——兼谈"斯托克代尔悖论" [转]
- android Run模式也会出现"Waiting for debugger"的解决方法
- 开发者模式下创建自定义菜单返回{ "errcode": -1, "errmsg": "system error" }
- "大"话"小"结(2)——创建型模式
- 模式识别 - "分类" 和 "回归" 的区别
- Java中的"=="和"equals()"的区别 String中的单例模式
- "观察者模式"
- Java练习题-编写一个线程安全的延迟加载单例模式(懒汉模式)
- "成功WEB商务"的7步走(4)——构建商业模式
- 不要在DEBUG模式下使用STL实现"复杂的"算法
- 如何修改android手机MTP,PTP,充电模式下 在windows电脑任务栏显示的"弹出Android","弹出MTP"提示语