HeadFirst设计模式_读书笔记_004_单例模式
来源:互联网 发布:nginx 维护页面配置 编辑:程序博客网 时间:2024/06/06 06:30
单例模式:确保一个类只有一个实例,并提供一个全局访问点。通常被用来管理公共资源。例如,数据库连接池或是线程池。
public class Singleton {private static Singleton instance;private Singleton(){System.out.println("There is only on Singleton ");}public static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;}}
上面这种写法在多线程下可能会出现问题。假如现在有两个线程A,B, A和B同时进入方法getInstance, A 判断instance为Null,调用私有构造方法创建Singleton的实例,此时B也刚好进入getInstance方法,A还未创建实例成功,此时instance也为null,所以B线程也会调用构造方法创建实例。此时就会出现多线程灾难了。
解决的方法1: 将 getinstance方法前增加关键字:synchronized 关键字。迫使每个线程进入这个方法前先等候别的线程离开该方法。
public synchronized static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;}
这样做可以解决多线程灾难问题,但是会降低性能。事实上,只有在第一次调用getInstance()方法,即instance 还没有被实例之前才需要同步。
解决方法2:使用'急切'创建实例,而不是等到要用的时候再创建。
public class Singleton2 {private static Singleton2 instance = new Singleton2();private Singleton2(){}public static Singleton2 getInstance(){return instance;}}
解决方法3:用双向检查加锁。在getInstance()方法中减少使用同步。
public class Singleton3 {private Singleton3(){}private static volatile Singleton3 instance;public static Singleton3 getInstance(){if(instance == null){synchronized(Singleton3.class){if(instance == null){instance = new Singleton3();}}}return instance;}}
0 0
- HeadFirst设计模式_读书笔记_004_单例模式
- 《HeadFirst设计模式》读书笔记-第5章-单例模式
- HeadFirst设计模式 读书笔记
- HeadFirst设计模式 读书笔记
- 读书笔记:《HeadFirst设计模式》
- HeadFirst设计模式读书笔记
- HeadFirst设计模式--单例模式
- HeadFirst设计模式_读书笔记_001_策略模式
- HeadFirst设计模式_读书笔记_002_观察者模式
- HeadFirst设计模式_读书笔记_003_装饰者模式
- HeadFirst设计模式_读书笔记_005_命令模式
- HeadFirst设计模式_读书笔记_006_适配器模式
- HeadFirst设计模式_读书笔记_007_外观模式
- HeadFirst设计模式_读书笔记_009_ 组合模式
- HeadFirst设计模式_读书笔记_010_状态模式
- HeadFirst设计模式_读书笔记_008_模板方法
- HeadFirst设计模式 读书笔记1
- HeadFirst设计模式 读书笔记2
- Spring整合Hibernate需要引入的包
- 移动自动化测试_Appium_002_第一个测试示例
- ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
- AngularJS
- 移动自动化测试_Appium_003_连华为P9真机测试
- HeadFirst设计模式_读书笔记_004_单例模式
- Android Material Design Support Library详解(SnackBar、NavigationView、FloatActionButton等)
- 关于权限的数据库设计
- Toaster多功能 Android 吐司工具
- HeadFirst设计模式_读书笔记_005_命令模式
- HeadFirst设计模式_读书笔记_006_适配器模式
- 快速理解C#高级概念事件与委托的区别
- java,android连接数据库mysql
- 自动化测试:关于软件自动化测试用例设计的几点分析