单例模式与instance = new Singleton();
来源:互联网 发布:淘宝买家恶意申请退款 编辑:程序博客网 时间:2024/06/09 21:57
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (instance) {
- if (instance == null) {
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
上面的代码表面上看可以很好的确保“单例”,即一个对象只有唯一的实例。
但是
在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();语句是分两步执行的。但是JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员,然后再去初始化这个Singleton实例。这样就可能出错了,我们以A、B两个线程为例:
a>A、B线程同时进入了第一个if判断
b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。(还没有初始化的时候,另一个线程占领了cpu并进行了判断)
d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
所以程序还是有可能发生错误,其实程序在运行过程是很复杂的,从这点我们就可以看出,尤其是在写多线程环境下的程序更有难度,有挑战性。我们对该程序做进一步优化:
- private static class SingletonFactory{
- private static Singleton instance = new Singleton();
- }
- public static Singleton getInstance(){
- return SingletonFactory.instance;
- }
实际情况是,单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题。同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题。
- 单例模式与instance = new Singleton();
- 单实例(Singleton) single instance 模式
- java与模式 单例(Singleton)
- 单例(Singleton)模式
- singleton 单例模式
- Singleton单例模式
- Singleton(单例)模式
- Singleton 单例模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- Singleton(单例)模式
- Singleton(单例)模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- 单例模式Singleton
- Singleton (单例模式)
- Singleton单例模式
- 单例模式----SingleTon
- 用图片搜索图片的几个好网站
- POJ 3176,1163 數字三角形
- UITextView上面一段空白,文字从下面的位置开始显示
- [Vim]新建python文件自动添加python header
- Ruby-初印象
- 单例模式与instance = new Singleton();
- UVa10354 - Avoiding Your Boss(Dijkstra的巧妙用法 ,针对有多个最短路径)
- Dispatcher initialization failed Unable to load configuration. - [unknown location]
- hbase调优
- jsp内置对象page对象、pageContext对象、Config对象、exception对象
- cxf webservice生成wsdl文件错误
- poj1273 EK
- git更换仓库地址
- C++ 注意事项