懒汉单开关怎么接线线

 
 

运行结果一直都是true,说明单线程下昰没问题的下面写个多线程来访问单例

 //存放单例对象,使用Set是为了不存放重复元素 

使用多线程并发访问单例:

 

说明有线程并发访问安全問题获取的不一定都是同一个实例

如何解决线程安全问题呢?

当然使用同步锁机制了啊

 

加入同步函数后线程安全问题解决了

运行多次都昰获取同一个实例不会出现2个实例的情况了

但是在多线程并发访问的情况下,每个线程每次获取实例都要判断下锁效率比较低,为了提高效率我加入了双重判断的方法,解决了效率的问题

 /*如果第一个线程获取到了单例的实例对象
 * 后面的线程再获取实例的时候不需要進入同步代码块中了*/
 //同步代码块用的锁是单例的字节码文件对象,且只能用这个锁
 

用这种方式解决了懒汉式的线程安全问题也提高了效率,但是在实际开发中还是用饿汉式的比较多毕竟这个代码比较多,比较繁琐

以上就是小编为大家带来的完美解决单例设计模式中懒漢式线程安全的问题全部内容了,希望大家多多支持脚本之家~

}

单例模式是设计模式中用得比较哆的一种设计模式它的主要优点有:

1.访问受控,保证访问的是唯一的实例

2.由于只有一个实例,所以节省资源 

灵活性低,如果对象的應用场景多变则不适用单例模式。

1.1 懒汉模式(线程不安全)

想要实现单例莫非就是要适用static关键字,如下声明一个对象:

这样我们就得到了一个類型为SingleTon的静态变量,接下来我们就要控制这个类,不能被任意的new出来这个就是实现了单例模式唯一性的根本,代码如下:

//把构造函数设置为private,防止被new实例化

这种模式的单例在非并发环境下是可靠的我们知道,我们保证类是单例的代码关键是

并且java中new是不具有原子性的(涉及到賦值问题)所以,在并发环境下是可能执行了多次的new操作,造成实例非唯一性

为了解决问题,首先就要明白问题产生的原因:

上述懒汉產生多个实例造成单例失效的原因是在高并发环境下可能同时有2个或以上的线程访问getInstance()类方法又因为new操作不具有原子性,所以会导致产生2個实例的问题

1.通过添加synchronized来修饰getInstance()方法,简单有效粗暴但是往往暴力使用同步方法带来的问题都是一样的,就是惨重的效率代价~

2.通过添加synchronized來同步部分代码块并且通过volatile来防止指令重排,代码如下:

上述方法就是传说中的DCL双重检查锁定单例(JDK1.5之后的版本)

}

饿汉式会有效率的问题,即加载类時就会创建那个静态对象,会占据一定内存,如果你的类不大,第一种方法是好的.

如楼上所说,懒汉式会有线程安全的问题.可以通过 双重检查加锁 方法来解决.你可以去搜搜.百度上也有.

解决方法是:双重检查加锁机制实现

}

我要回帖

更多关于 单开关怎么接线 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信