单例模式在多线程中的使用情况
来源:互联网 发布:如何购买阿里云空间 编辑:程序博客网 时间: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对象和数据。这就做到了线程内部的数据是共享的,而线程与线程之间的数据是独立的。
- 单例模式在多线程中的使用情况
- 多线程中的单例模式
- 多线程中的单例模式
- Java单例模式在多线程环境中的实现
- Java单例模式在多线程环境中的实现
- Java 单例模式在多线程环境中的实现
- 单例模式在多线程中的安全性研究
- 如何保证单例模式在多线程中的线程安全性
- 单例模式在多线程并发情况下的一些思考。
- 使用enum枚举数据类型实现多线程中的单例模式
- 多线程情况下的单例模式创建
- 转:多线程情况下的单例模式
- 记录单例模式遇到多线程时的多种情况
- 单例模式 各种情况下的演进 多线程
- 单例模式中的多线程分析
- C++单例模式在Qt编程中的使用
- Java单例模式在开发中的使用
- C++单例模式在Qt编程中的使用
- cisco VPN 打开程序后自动消失,不可见
- hdu 4565 So Easy! 递推+矩阵快速幂
- java实现无符号数转换、字符串补齐、md5、uuid、随机数示例
- Android 删除标题栏或自定义标题栏注意事项
- Twisted网络编程必备(4)
- 单例模式在多线程中的使用情况
- extjs4.0---- treepanel和gridpanel示例
- Twisted网络编程必备(5)
- Printf,fprintf和sprin
- 判断是否为字符串
- 【7】翻转单词顺序
- Effective C++ Item 15 在资源管理类中提供对原始资源的访问
- Python中最快的字典排序方法
- 第十一章 字符串和字符串函数(定义字符串)总结 140524