- 浏览: 52346 次
- 性别:
- 来自: 杭州
文章分类
最新评论
当考虑到每个线程共享多个变量时,需要定义多个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 549public static void main(String[ ... -
fastjson空值不处理
2017-09-21 15:21 0fastjson在处理对象转化为json串的时候,对于字段值为 ... -
java位运算
2017-09-19 10:05 494java位运算符 位运算符主要针对二进制,针对的是两个二 ... -
java final作用
2017-09-14 09:12 408final关键字的作用 1、被final修饰的类不可以被继承 ... -
System.getProperty使用
2017-07-23 15:27 823java的System.getProperty()方 ... -
Java如何获取当前的jar包路径
2017-07-23 12:28 2570最近在写一个可运行的jar包,需要从导出后跟jar同级目录读取 ... -
java并发编程中分配线程池数跟CPU密集型任务和I/O密集型任务有关
2017-05-25 20:03 1075CPU密集型任务:应用主要是使用非常多的cup资源,进行无阻塞 ... -
循环遍历集合过程中往集合添加或是删除元素报java.util.ConcurrentModificationException
2017-05-15 19:16 0java.util.ConcurrentModificatio ... -
图片压缩场景选择
2017-04-18 19:00 3961、平台上传图片,但是图片大小不确定(不会超过50M),后台处 ... -
PropertyUtils复制属性报错
2017-05-02 19:46 558java.lang.IllegalArgumentExcept ... -
通过jdk自带的反编译工具命令 javap
2017-04-10 09:39 0通过jdk自带的反编译工具命令 javap 可以查看class ... -
属性命名不遵守javaBean规范导致版本升级后获取不到值
2017-04-01 17:03 447如下所示: struts2 Action中存在如下定义的i ... -
bat批处理命令运行jar包中的main方法
2017-04-01 11:08 1508一、Eclipse导出可运行的 ... -
项目中jdk高版本编译后的代码在低版本的jdk运行报错
2017-03-23 16:10 984项目中jdk高版本编译后的代码运行在低版本的jdk的tomca ... -
java 获取同一个网关下不同客户端的ip失败
2017-03-31 20:11 653java 获取同一个网关下不同客户端的ip,得到的客户端的ip ... -
程序中解析域名报错
2017-03-16 09:00 700项目中通过webservice接口往第三方传送数据,本地配置是 ... -
服务器推送技术简单介绍
2017-03-12 19:01 0传统模式的 Web 系统以 ... -
java中调用语音库
2016-12-25 18:30 675java中调用语音库参考http://blog.csdn.ne ... -
非技术
2015-07-24 15:52 0近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分 ...
相关推荐
ThreadLocal通常被用来解决线程共享数据时可能出现的并发问题,避免了使用synchronized关键字进行同步控制的复杂性。 在Java中,ThreadLocal的工作原理是为每个线程创建一个单独的存储空间,每个线程可以独立地读写...
ThreadLocal 的实现原理可以分为两个部分:第一部分是 ThreadLocal 对象的创建和管理;第二部分是 ThreadLocal 对象的访问和更新。 ThreadLocal 对象的创建和管理是通过 ThreadLocalMap 来实现的。 ...
在Java中,有多种方式可以实现线程间的数据共享和对象独立,其中ThreadLocal是常用的工具之一。 在多线程环境下,共享数据通常会引发线程安全问题,比如上述例子中的“张三给李四转钱”场景,如果两个线程同时操作...
1. **弱引用**:由于`ThreadLocalMap`的键使用弱引用,因此当没有强引用指向某个`ThreadLocal`时,JVM会在下一次垃圾回收时回收该`ThreadLocal`对象。 2. **expungeStaleEntry方法**:当`ThreadLocal`对象被垃圾...
Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...
3. **如何使用ThreadLocal实现Session管理?** 首先,定义一个ThreadLocal变量来存储session对象: ```java public class SessionThreadLocal { public static final ThreadLocal<Session> SESSION_HOLDER = new...
- **简单易用**:ThreadLocal提供了一种简单的线程间数据隔离的实现方式,代码简洁,无需复杂的同步机制。 - **性能提升**:避免了线程同步的开销,提高了程序执行效率。 缺点: - **内存泄漏风险**:如果不正确地...
单例模式在控制资源的共享、管理配置对象等方面非常有用,例如数据库连接池的管理。 其次,工厂模式是创建型设计模式之一,它提供了一种创建对象的最佳方式。在工厂模式中,用户无需知道具体产品类的名称,只需知道...
Entry继承自WeakReference<ThreadLocal>,这意味着ThreadLocal对象如果不再被引用,可以被垃圾收集器回收,避免内存泄漏。然而,这种设计也存在一个问题:如果ThreadLocal没有被外部引用,但其对应的Entry还在Map中...
当Java事务与ThreadLocal结合使用时,可以在不同的线程中维护各自的事务状态,比如在Spring框架中,每个线程的ThreadLocal可以存储一个TransactionStatus对象,这样就可以在线程内部管理当前事务的状态,而不会影响...
**线程局部变量(ThreadLocal)** 在Java编程中,`ThreadLocal`是...以上就是关于`ThreadLocal`及其内部类`ThreadLocalMap`的基础知识,它们在多线程编程中起到关键作用,帮助开发者实现高效、安全的线程局部变量管理。
ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...
`ThreadLocalMap`使用弱引用作为键,目的是在线程不再引用ThreadLocal对象时,允许垃圾回收器回收该对象,从而避免内存泄漏。然而,如果线程仍然存活并且`ThreadLocalMap`中的值没有被其他引用保持,那么可能会出现...
它通过在对象上加锁来确保多个线程能够安全地访问共享资源。 - **作用原理:** - 当一个线程访问某个方法或者某个对象的同步代码块时,它必须首先获取该对象的锁。 - 如果另一个线程试图同时访问这个被锁定的对象...
总的来说,结合JDBC的事务管理和ThreadLocal,我们可以在多线程环境中更好地实现数据库操作,确保数据的一致性,并提高代码的可复用性和安全性。通过使用ThreadLocal,我们可以创建线程安全的变量,使得每个线程都能...
但是,如果ThreadLocalMap中的值(通常是对象)仍然被其他强引用保持,那么即使ThreadLocal实例被回收,值仍然存在于ThreadLocalMap中,这可能导致内存泄漏。因此,务必在不再使用ThreadLocal变量时调用`remove()`。...
总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多线程环境下隔离数据,避免了传统的同步机制。但是,使用时需注意其潜在的内存泄漏风险和对代码可读性的影响,合理地选择使用...