单例模式在多线程中的使用情况

版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/l1028386804/article/details/26875115

废话不多说,直接上代码:

class MyThreadScopeData{
    
    private MyThreadScopeData(){}
    private static MyThreadScopeData instance;
    //单例设计模式
    public static MyThreadScopeData getInstance(){
        if(instance ==null){
            instance = new MyThreadScopeData();
        }
        return instance;
    }

}

上述代码中。假设直接用于多线程中是存在问题的,比方线程A调用MyThreadScopeData.getInstance()获取MyThreadScopeData对象,运行到 instance = new MyThreadScopeData();还没返回的时候恰好这时候线程B也来调用MyThreadScopeData.getInstance(),运行了 instance = new MyThreadScopeData();这时候则线程B创建的对象会覆盖线程A创建的对象。所以在线程A中的MyThreadScopeData对象事实上已经发生了变化。在实际操作过程中会存在问题。

怎样避免这样的情况呢。就要用到线程中的共享变量问题了,这就要涉及到对ThreadLocal类的使用。

这时能够将上面的代码改动例如以下:

class MyThreadScopeData{
    
    private MyThreadScopeData(){}
    //单例设计模式
    //定义ThreadLocal
    private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
    public static MyThreadScopeData getThreadInstance(){
        MyThreadScopeData instance = map.get();
        if(instance ==null){
            instance = new MyThreadScopeData();
            map.set(instance);
        }
        return instance;
    }
}

在单例类中定义一个ThreadLocal对象用于存储这个类本身的对象,当线程A调用MyThreadScopeData getThreadInstance()方法获取MyThreadScopeData对象的时候,首先从ThreadLocal中获取保存在线程A中的MyThreadScopeData对象,假设没有,则创建一个新的MyThreadScopeData对象。将此对象保存在ThreadLocal对象中。然后返回MyThreadScopeData 对象。当线程B调用MyThreadScopeData getThreadInstance()方法获取MyThreadScopeData 对象的时候,流程和线程A调用MyThreadScopeData getThreadInstance()方法一样。此时线程A和线程B各自保存和操作自己线程范围内的MyThreadScopeData对象和数据。这就做到了线程内部的数据是共享的,而线程与线程之间的数据是独立的。



转载于:https://www.cnblogs.com/xfgnongmin/p/10711090.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值