ThreadLocal和单例对象比较
单例对象: 自始至终只有一个对象
当线程并发,每个线程需要自己独立的资源变量处理不同的业务时,单例对象远远不能满足需求
因此可以采用ThreadLocal模式 : 每个线程有自己独立的资源变量 而且每个线程的资源是独享的 其他线程不能访问和修改
笔者刚开始工作时候使用的Struts2,也曾略读过Struts2源码;就个人而言 虽然和现在对比已经过时,但是Struts2的设计思想还是很不错的,每个请求对应一个Action对象
也是ThreadLocal的代表,除去Struts2的标签和OGNL,整体性能也是不错的,读者有兴趣可以自己研究一下
单利模式:
//单例模式 私有构造 只有一个对象
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public synchronized static Singleton getInstance(){
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
ThreadLocal模式
public class Struts2{
private static ThreadLocal<Struts2> map = new ThreadLocal<Struts2>();
private Struts2(){
}
// synchronized不需要设置 每个线程享有自己独立资源
public static Struts2 getThreadInstance(){
Struts2 instance = map.get();
if(instance == null){
instance = new Struts2();
map.set(instance);
}
return instance;
}
//Strtus2就是这种设计思想
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
//测试类public class TestThreadLocal{
public static void main(String[] args) {
for(int i=0;i<2;i++){
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + " has put data :" + data);
Struts2.getThreadInstance().setMsg(data+""); //存数据
new UserA().get();
new UserB().get();
}
}).start();
}
}
static class UserA{
public void get(){
Struts2 obj = Struts2.getThreadInstance();
System.out.println("UserB from " + Thread.currentThread().getName() + " 数据是 : "+obj.getMsg() );
}
}
static class UserB{
public void get(){
Struts2 obj = Struts2.getThreadInstance();
System.out.println("UserB from " + Thread.currentThread().getName() + " 数据是 : "+obj.getMsg() );
}
}
}
输出结果:
Thread-1 has put data :223586296
Thread-0 has put data :1184404572
UserB from Thread-0 数据是 : 1184404572
UserB from Thread-1 数据是 : 223586296
UserB from Thread-1 数据是 : 223586296
UserB from Thread-0 数据是 : 1184404572
备注:每个线程有只属于这个线程的对象,每个线程享有自己独立的副本,内部相当于一个Map key[当前线程] - vlaue[值], 线程结束后 会自动把结束的线程移除,不需要自己remove
ThreadLocal和单例对象比较的更多相关文章
- 设计模式课程 设计模式精讲 8-10 单例设计模式-ThreadLocal线程单例
1 课程讲解 1.1 应用场景 2 代码演练 2.1 threadLocal应用 1 课程讲解 1.1 应用场景 多线程的时候: 使用同步锁使用时间换空间的方式,(线程排队时间比较长) 而使用thre ...
- 010-Scala单例对象、伴生对象实战详解
010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...
- apply 伴生对象 单例对象
apply(): 当类或者对象有一个主要用途时,apply方法提供了很好语法机制 scala> class Foo {} defined class Foo scala> object F ...
- Scala单例对象、伴生对象实战详解
1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...
- 不允许在单例对象中创建Srping容器
spring.net在使用的时候,不允许在单例对象中创建Srping容器 需要将实例化模式转为单例singleton=“false”
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
- iOS 如何创建单例对象
一.什么是单例? 说到单例我就想起了我的java啊 ,不禁感叹起我的大学时光,学了4年的java开发,到现在还是放弃了我的java,踏入了iOS的行列. 算了,入正轨,我现在正是铁树银花的青春美少女, ...
- 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
为何将单例模式移除 在Cocos2d-JS v3.0之前.全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环.可惜的是,这样的统一性也在非常大程度上限制了C ...
- Kotlin入门(18)利用单例对象获取时间
前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...
随机推荐
- win32 socket编程(二)——TCP/IP
一.大端.小端法定义 1.1小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. (主机字节顺序) 1.2 大端法(Big-Endian ...
- JVM 垃圾回收(GC)机制
目录 一.背景 二. 哪些内存需要回收? 1.引用计数算法 2 .可达性分析算法 三. 四种引用状态 1.强引用 2.软引用 3.弱引用 4.虚引用 对象死亡(被回收)前的最后一次挣扎 方法区如何判断 ...
- Robot Framework 源码阅读 day2 TestSuitBuilder
接上一篇 day1 run.py 发现build test suit还挺复杂的, 先从官网API找到了一些资料,可以看出这是robotframework进行组织 测试案例实现的重要步骤, 将传入的te ...
- lua视频教程三套高清新
目录 1. 下载地址 2. 某网校 Lua 经典教程 3. lua脚本语言零基础开发教程19课全 4. LUA完整视频+Cocos2d-x项目实战 1. 下载地址 https://www.cnblog ...
- zabbix 4.2 安装教程
1.我这里使用的是ali的yum源 #wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...
- 完整项目:网上图书商城(一、MySQL数据库设计)未完
一.建立数据库 CREATE DATABASE IF NOT EXISTS bookshop CHARACTER utf8; 二.建立数据库表 1.建立用户表 #用户表(用户id号,用户名,用户密码, ...
- OA是Office Automation
OA是Office Automation OA是Office Automation OA是Office Automation
- sqlmap POST注入
带表单的页面: 1.sqlmap.py -u "http://mysqli/Less-11/" --forms 2.python sqlmap.py -r d:\test.txt ...
- css3 动画实例
animation 动画 animation-duration 代码实例: <!DOCTYPE html> <html> <head> <meta chars ...
- 从保障淘宝到全球市场“第一阵营”,阿里云的DDoS防护之路走了多远?
2年前,不少技术圈的朋友,读过论坛里的一篇解读文章:DDoS,阿里为什么要走自己的一条路(https://bbs.aliyun.com/read/271764.html?pos=13),文章讲述了阿里 ...