有关单例模式赋值失败的问题

本文记录了一次使用单例模式进行对象赋值时遇到的失败情况,并探讨了问题可能的原因,涉及到懒汉模式与饿汉模式的区别,以及同步问题如何影响单例模式的正确实现。

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

今天在使用单例模式赋值时,出现了赋值失败的问题:

User user=new Gson().fromJson(u, User.class);
Test.getInstance().user=user;

第二句得到为null

Test.class

public class Test {
    private static Test test;
    public User user;
    public String cookie="";


    private Test(){}

    public static Test getInstance() {
        if (test == null)
            return new Test();
        else
            return test;
    }
}


以前我也这样用过,但是没有出现赋值失败的情况,上述为懒汉模式,当我把懒汉改为饿汉时赋值成功,或者懒汉中对user实例化,也能赋值成功。

暂时不懂赋值失败的原因,记录一下这个BUG。


更新

——————————————————————————————


应该是与懒汉模式的缺陷有关,没有加锁,可能出现了同时读写的操作

### 饿汉式单例模式实现详解 饿汉式单例模式是一种在类加载时就创建实的设计模式。它的特点是实在程序启动时就已经被创建,因此不需要进行任何检查或延迟初始化。这种实现方式的优点是简、线程安全,但缺点是无论是否使用该实,都会占用内存资源。 以下是饿汉式单例模式的实现细节和代码示例: #### 实现原理 饿汉式单例模式通过将构造函数设为私有,并在类中直接创建一个静态实来确保只有一个对象被创建。由于静态变量在程序启动时就会被初始化,因此无需额外的同步机制,天然支持线程安全[^1]。 #### 代码示例 以下是一个典型的饿汉式单例模式实现: ```cpp #include <iostream> using namespace std; class SingletonHungry { private: // 私有构造函数,防止外部实化 SingletonHungry() { cout << "我是饿汉式构造函数" << endl; } // 禁止拷贝构造函数和赋值操作符,防止复制实 SingletonHungry(const SingletonHungry&) = delete; SingletonHungry& operator=(const SingletonHungry&) = delete; public: // 静态方法,返回唯一的实 static SingletonHungry* getInstance() { return pSingleton; } private: // 静态成员变量,存储唯一实 static SingletonHungry* pSingleton; }; // 类外初始化静态成员变量,直接创建实 SingletonHungry* SingletonHungry::pSingleton = new SingletonHungry; int main() { // 获取 SingletonHungry* instance1 = SingletonHungry::getInstance(); SingletonHungry* instance2 = SingletonHungry::getInstance(); // 验证两个指针是否相同 if (instance1 == instance2) { cout << "两个实相同,单例模式成功!" << endl; } else { cout << "两个实不同,单例模式失败!" << endl; } return 0; } ``` #### 代码解析 1. **私有构造函数**:`SingletonHungry()` 被设为私有,防止外部直接通过 `new` 或其他方式创建实。 2. **静态成员变量**:`pSingleton` 是一个指向类实的静态指针,在类外初始化时直接创建实。 3. **静态方法**:`getInstance()` 提供全局访问接口,返回已创建的唯一实。 4. **线程安全性**:由于实在程序启动时就已经创建,因此不存在多线程竞争问题,天然线程安全[^2]。 #### 注意事项 - 饿汉式单例模式在程序启动时即创建实,可能会浪费内存资源,特别是在实较大或不常使用的情况下。 - 如果需要延迟初始化或更灵活的控制,可以考虑懒汉式或其他变种实现方式[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值