设计模式_17:单例模式
来源:互联网 发布:怎么卸载还原软件 编辑:程序博客网 时间:2024/05/29 10:30
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点(原书)
举个例子:例如计划生育,每对夫妇只能有一个孩子:
public class Main { public static void main(String[] args) { Children children_1 = Children.getInstance(); Children children_2 = Children.getInstance(); System.out.println(children_1 == children_2); }}class Children { private static Children children; private Children() {} public static Children getInstance() { if (null == children){ children = new Children(); } return children; }}
运行结果:
true
可以看到,Children类的构造方法被私有化了,而取得该类对象的方法只有调用getInstance方法,并且getInstance方法只有在静态对象children为null是才会生成对象返回,所以children_1和children_2指向的都是同一个对象。
但是在多线程的情况下,还是会有实例被多次构造(也就是children = new Children();这句被重复执行)的可能,因此需要加上同步关键字synchronized:
public static Children getInstance(){ synchronized (Children.class){ if (null == children){ children = new Children(); } } return children; }
但这样就会造成性能的问题:每次调用getInstance方法都要加锁执行同步块里面的内容,可以优化一下,在外层加一个是否为空的判断:
public static Children getInstance(){ if (null == children){ synchronized (Children.class){ if (null == children){ children = new Children(); } } } return children; }
上面的例子都属于懒汉式的单例模式:只有调用getIntance才会构建对象
下面看看饿汉式的,在类加载的时候就把对象给new出来了,因此就不存在多线程问题:
class Children { private final static Children children = new Children(); private Children(){} public static Children getInstance(){ return children; }}
阅读全文
0 0
- 设计模式_17:单例模式
- 抽象工厂模式(设计模式_17)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 设计模式-单例模式
- [设计模式] 单例模式
- 设计模式--单例模式
- 设计模式---单例模式
- 设计模式--单例模式
- IOS 快速查看系统键盘样式
- npm install 时总是报phantomjs-prebuilt@2.1.14安装失败
- BZOJ 1053 浅谈正统素数的侧面反素数A.N.T.
- Qt笔记-qml-button
- Failed to load JavaHL Library.(SVN)解决办法
- 设计模式_17:单例模式
- XListView下拉刷新带时间
- 还是端口回流问题 TCP协议解析
- 从JVM中dump出动态代理生成的class
- memmove 和 memcpy的区别以及处理内存重叠问题
- centos6.5 升级和docker的安装
- Java中this和super的用法总结
- Qt单元测试--基本使用
- SpringBootServletInitializer main