java单例饿汉和懒汉模式
今天总结一下单例模式,因为之前去面试,面试官老是问这个问题。
之前就是搞javaweb,也经常会用到单例,但是却不知道那就是单例。
首先说单例模式的两种方式,一种是饿汉式,就是在类初始化的时候,创建对象,这种方式是线程安全的,在程序运行期间就这一个对象。
另一种是懒汉式,懒汉式是在第一次使用时才创建对象,但是如果在多线程环境中要考虑线程安全问题。
比较喜欢的方式:饿汉式,不用考虑线程安全问题。
操作方法
- 01
首先定义一个Singleton类
- 02
编写测试类,饿汉模式: 定义一个静态的变量Singleton,直接初始化。 定义一个静态方法返回单例对象。
- 03
懒汉模式:存在线程安全问题。 定义对象s2,定义静态方法getS2获取对象。
- 04
编写测试类,测试是否会创建多个对象。 测试类创建500个线程,去调用getS2方法。
- 05
查看输出,发现输出了3个new,说明创建了三个对象,在高并发的多线程情况下,这种方式,显然不能满足单例的要求。
- 06
双重锁写法。在获取对象的时候,先判断是否为空,不为空直接返回,否则就加锁,加完锁然后再次需要判断是否为空。 先看一下正确的写法,测试一下,发现就一个输出,说明正确。
- 07
如果把里面的判null去掉,再去测试。发现有两个输出,说明不是单例。 为什么哪,因为可能出现这种情况,线程A、B同时请求加锁,此时两个线程都已通过了第一个为空的判断,假设A线程先加锁,B线程等待,然后A去创建对象;A释放锁后,B线程加锁,又创建了对象。
- 08
所以说,懒汉模式的正确写法为:
赞 (0)