java单例饿汉和懒汉模式

 时间:2026-02-17 03:22:45

1、首先定义一个Singleton类

java单例饿汉和懒汉模式

2、编写测试类,饿汉模式:

   定义一个静态的变量Singleton,直接初始化。

   定义一个静态方法返回单例对象。

java单例饿汉和懒汉模式

3、懒汉模式:存在线程安全问题。

   定义对象s2,定义静态方法getS2获取对象。

java单例饿汉和懒汉模式

4、编写测试类,测试是否会创建多个对象。

   测试类创建500个线程,去调用getS2方法。

java单例饿汉和懒汉模式

5、查看输出,发现输出了3个new,说明创建了三个对象,在高并发的多线程情况下,这种方式,显然不能满足单例的要求。

java单例饿汉和懒汉模式

6、双重锁写法。在获取对象的时候,先判断是否为空,不为空直接返回,否则就加锁,加完锁然后再次需要判断是否为空。

先看一下正确的写法,测试一下,发现就一个输出,说明正确。

java单例饿汉和懒汉模式

java单例饿汉和懒汉模式

7、如果把里面的判null去掉,再去测试。发现有两个输出,说明不是单例。

为什么哪,因为可能出现这种情况,线程A、B同时请求加锁,此时两个线程都已通过了第一个为空的判断,假设A线程先加锁,B线程等待,然后A去创建对象;A释放锁后,B线程加锁,又创建了对象。

java单例饿汉和懒汉模式

java单例饿汉和懒汉模式

8、所以说,懒汉模式的正确写法为:

java单例饿汉和懒汉模式

  • ADO.NET 注册用户
  • 轻松解决svn服务器ip改变后,eclipse如何改变?
  • Java加密解密总结
  • 如何利用最新版eclipse安装开发C++软件系列
  • Could not write metadata for
  • 热门搜索
    减肥专家 英雄杀攻略 三国志曹操传攻略 西安交通大学城市学院怎么样 怎么减肥最快最有效 心里压力大怎么办 生殖器疱疹怎么传染 泡发好的海参怎么吃 得了痔疮怎么治疗 云台山旅游攻略