学习日记13 饿汉式和懒汉式

本文详细介绍了单例设计模式中的两种实现方式:饿汉式和懒汉式。饿汉式在类加载时就创建实例,确保线程安全;懒汉式则在首次调用时创建实例,需额外考虑线程安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
单例设计模式。


*/
//饿汉式。
/*
class Single
{
 private static final Single s = new Single();
 private Single(){}
 public static Single getInstance()
 {
  return s;
 }
}
*/


//懒汉式

class Single
{
 private static Single s = null;
 private Single(){}


 public static  Single getInstance()
 {
  if(s==null)
  {
   synchronized(Single.class)
   {
    if(s==null)
     //--->A;
     s = new Single();
   }
  }
  return s;
 }
}

class SingleDemo
{
 public static void main(String[] args)
 {
  System.out.println("Hello World!");
 }
}

饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式没有加私有的构造函

### 饿汉式懒汉单例模的区别 #### 定义差异 饿汉式单例模的特点是在类加载时就创建好对象实例,无论后续是否会实际使用到这个实例。这种方类似于一位非常积极的工作者,总是提前准备好所需资源[^3]。 懒汉则不同,它采取按需初始化的方,在第一次调用获取实例方法的时候才去创建对象。这使得资源可以在真正需要之前一直保持未分配状态,从而节省内存开销[^4]。 #### 实现代码对比 ##### 饿汉式实现 ```cpp class Singleton { private: // 私有化构造函数防止外部new Singleton() {} public: // 类内定义并立即初始化静态成员变量 static Singleton instance; static Singleton& getInstance() { return instance; } }; // 初始化静态成员变量 Singleton Singleton::instance = Singleton(); ``` ##### 懒汉实现(非线程安全) ```cpp class Singleton { private: Singleton() {} // 构造函数私有化 static Singleton* _instance; public: static Singleton* getInstance() { if (_instance == nullptr) { _instance = new Singleton(); } return _instance; } }; Singleton* Singleton::_instance = nullptr; ``` 需要注意的是上述懒汉实现并不考虑多线程环境下的安全性问题。 #### 多线程环境下表现 当涉及到并发场景时,简单的懒汉存在明显的缺陷——多个线程可能几乎同时通过`if(_instance==nullptr)`条件判断进入临界区执行创建操作,进而导致同一个类产生了不止一个实例的情况发生。而饿汉式由于在编译期就已经完成了实例化的动作,因此天然具备良好的线程安全性[^2]。 为了克服这个问题,可以采用双重检测锁定(Double Checked Locking Pattern, DCLP) 或者利用Java中的枚举类型来构建更复杂的解决方案以确保线程安全的同时减少不必要的同步开销。 #### 反射攻击风险 无论是哪种形的传统单例模实现方案,在面对反射机制带来的挑战面前都显得力不从心。因为一旦允许恶意代码通过反射手段绕过正常的访问控制逻辑强行调用私有的构造器,则很容易破坏原有的唯一性约束,造成严重的安全隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值