- 浏览: 49750 次
- 性别:
- 来自: 杭州
文章分类
最新评论
当考虑到每个线程共享多个变量时,需要定义多个ThreadLocal变量,有时候这种定义方式不一定就行的通,这时可考虑将操作的多个变量封装到一个对象中,直接定义一个ThreadLocal变量即可。下面列出两种方式:
1、将对对象的获取放在当前线程中,也即当前线程中new一个新对象出来
2、将对对象的获取放在定义出来的对象中操作。(推荐)
第一种方式:
第二种方式:
1、将对对象的获取放在当前线程中,也即当前线程中new一个新对象出来
2、将对对象的获取放在定义出来的对象中操作。(推荐)
第一种方式:
/** * @author * @date 2017年4月16日下午3:46:41 * @description 线程范围内的共享对象如何设计 */ public class ThreadLocalTest { //如果需要多个变量跟当前线程线程相关时,把多个变量定义在一个对象中 private static ThreadLocal<OperatorData> myThreadData = new ThreadLocal<OperatorData>(); public static void main(String[] args) { for(int i = 0; i < 2; i++){ final int k = i; new Thread(new Runnable() { @Override public void run() { OperatorData threadData = new OperatorData(); threadData.setName("zhangsan" + k); threadData.setAge(k); threadData.setSex(k + ""); myThreadData.set(threadData); } }).start(); } } } /** * * @author * @description 将线程要操作的数据封装到一个对象中 */ class OperatorData{ private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
第二种方式:
/** * @author * @date 2017年4月16日下午3:46:41 * @description 线程范围内的共享对象如何设计 */ public class ThreadLocalTest { public static void main(String[] args) { for(int i = 0; i < 2; i++){ final int k = i; new Thread(new Runnable() { @Override public void run() { OperatorData threadData = OperatorData.getInstance(); threadData.setName("zhangsan" + k); threadData.setAge(k); threadData.setSex(k + ""); } }).start(); } } } /** * * @author * @description 将线程要操作的数据封装到一个对象中 */ class OperatorData{ private String name; private String sex; private int age; //模仿单列的写法 private OperatorData(){}; private static ThreadLocal<OperatorData> myThreadDataLocal = new ThreadLocal<OperatorData>(); public static OperatorData getInstance(){ OperatorData instance = myThreadDataLocal.get(); if(instance == null){ instance = new OperatorData(); myThreadDataLocal.set(instance); } return instance; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
发表评论
-
流未关闭导致调用delete方法删除失败
2017-11-02 20:00 499public static void main(String[ ... -
fastjson空值不处理
2017-09-21 15:21 0fastjson在处理对象转化为json串的时候,对于字段值为 ... -
java位运算
2017-09-19 10:05 464java位运算符 位运算符主要针对二进制,针对的是两个二 ... -
java final作用
2017-09-14 09:12 361final关键字的作用 1、被final修饰的类不可以被继承 ... -
System.getProperty使用
2017-07-23 15:27 784java的System.getProperty()方 ... -
Java如何获取当前的jar包路径
2017-07-23 12:28 2497最近在写一个可运行的jar包,需要从导出后跟jar同级目录读取 ... -
java并发编程中分配线程池数跟CPU密集型任务和I/O密集型任务有关
2017-05-25 20:03 1010CPU密集型任务:应用主要是使用非常多的cup资源,进行无阻塞 ... -
循环遍历集合过程中往集合添加或是删除元素报java.util.ConcurrentModificationException
2017-05-15 19:16 0java.util.ConcurrentModificatio ... -
图片压缩场景选择
2017-04-18 19:00 3321、平台上传图片,但是图片大小不确定(不会超过50M),后台处 ... -
PropertyUtils复制属性报错
2017-05-02 19:46 469java.lang.IllegalArgumentExcept ... -
通过jdk自带的反编译工具命令 javap
2017-04-10 09:39 0通过jdk自带的反编译工具命令 javap 可以查看class ... -
属性命名不遵守javaBean规范导致版本升级后获取不到值
2017-04-01 17:03 414如下所示: struts2 Action中存在如下定义的i ... -
bat批处理命令运行jar包中的main方法
2017-04-01 11:08 1392一、Eclipse导出可运行的 ... -
项目中jdk高版本编译后的代码在低版本的jdk运行报错
2017-03-23 16:10 921项目中jdk高版本编译后的代码运行在低版本的jdk的tomca ... -
java 获取同一个网关下不同客户端的ip失败
2017-03-31 20:11 618java 获取同一个网关下不同客户端的ip,得到的客户端的ip ... -
程序中解析域名报错
2017-03-16 09:00 669项目中通过webservice接口往第三方传送数据,本地配置是 ... -
服务器推送技术简单介绍
2017-03-12 19:01 0传统模式的 Web 系统以 ... -
java中调用语音库
2016-12-25 18:30 617java中调用语音库参考http://blog.csdn.ne ... -
非技术
2015-07-24 15:52 0近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分 ...
相关推荐
多个线程操作共享对象导致的状态不一致问题 原因 共享资源的竞态条件问题 问题 竞态条件 指令重排序 工作内存中主内存同步延迟 解决 要有安全策略文档或注释 不共享 线程封闭 仅在单线程内访问数据 栈...
3.5.6 安全地共享对象 第4章 对象的组合 4.1 设计线程安全的类 4.1.1 收集同步需求 4.1.2 依赖状态的操作 4.1.3 状态的所有权 4.2 实例封闭 4.2.1 Java监视器模式 4.2.2 示例:车辆追踪 4.3 线程安全性的...
2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...
3.5.6 安全地共享对象 第4章 对象的组合 4.1 设计线程安全的类 4.1.1 收集同步需求 4.1.2 依赖状态的操作 4.1.3 状态的所有权 4.2 实例封闭 4.2.1 Java监视器模式 4.2.2 示例:车辆追踪 4.3 线程安全性的...
加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的共享使用策略 线程封闭:线程封闭的对象只能由一个线程拥有并修改 Ad-hoc线程封闭 栈封闭 ThreadLocal...
一、前言 了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask... python中的threading.local对象已经实现,其原理是利用线程的唯一标识作为key,数据作为value来保存其自己的数据,以
java抢票软件源码 中高级java面试题整理 一 前端 ...解答: get和post的基本区别?说说 tcp/ip协议、三次握手、窗口滑动机制 解答: ...基本类型数据使用快速排序法,对象数组使用归并...ThreadLocal可以用来共享数据吗; Threa
共享常见的切入点(pointcut)定义 6.2.3.4. 示例 6.2.4. 声明通知 6.2.4.1. 前置通知(Before advice) 6.2.4.2. 返回后通知(After returning advice) 6.2.4.3. 抛出后通知(After throwing advice) 6.2.4.4. ...
│ 02-ThreadLocal解决线程资源共享 │ 03-弹层组件layer使用. [- l; o" [6 F# U# ~. a7 c │ 04-用户分页查询-分析-同步请求方式 │ 05-用户分页查询-分析-同步请求代码开发 │ 06-用户分页查询-分页导航条# a1 W7 ...
2.2.4. 堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ............................................
堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ..................................................