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

来源:互联网 发布:如何购买阿里云空间 编辑:程序博客网 时间:2024/05/29 04:34

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

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对象和数据。这就做到了线程内部的数据是共享的,而线程与线程之间的数据是独立的。


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 window10连不上网怎么办 电脑没有家庭组怎么办 usb共享网络出错怎么办 电脑共享有密码怎么办 win10连不上网怎么办 w10网络重置了怎么办 点击网络重置后怎么办? 电脑启动找不到硬盘怎么办 电脑开机找不到硬盘怎么办 电脑找不到宽带连接怎么办 电脑文件找不到了怎么办 电脑找不到手机热点怎么办 win7电脑没有网络适配器怎么办 手机计算机桌面找不到怎么办 手机忘记开锁密码怎么办 电脑没网感叹号怎么办 本地连接2没有了怎么办 电脑上找不到本地连接怎么办 网络无访问权限怎么办 电脑无网络访问怎么办 xp连不上网怎么办 xp系统本地连接不见了怎么办 电脑xp系统本地连接怎么办 xp系统本地连接失败怎么办 xp系统找不到本地连接怎么办 台式电脑连不上网络怎么办 win7局域网要密码怎么办 xp网络不能上网怎么办 台式电脑连宽带怎么办 win7宽带813错误怎么办 电脑不显示本地连接怎么办 w7宽带连接不了怎么办 网络接收器坏了怎么办 电脑网页打开慢怎么办 win10无法添加打印机怎么办 2018杭州禁摩怎么办 中山个人怎么办社保卡 昆山房产证丢了怎么办 于一机交宽带费怎么办 租房子的怎么办宽带 乐才注册不了怎么办