ThreadLocal实现线程范围内共享变量

  在web应用中,一个请求(带有请求参数)就是一个线程,那么如何区分哪些参数属于哪个线程呢?比如struts中,A用户登录,B用户也登录,那么在Action中怎么区分哪个是A用户的数据,哪个是B用户的数据。这就涉及到ThreadLocal类了,将变量与当前线程绑定。比如struts中,有一个容器类,那么A用户将数据放在A的容器中,B用户将数据放在B的容器中,然后再将容器与线程绑定,这样的话,A请求的线程处理A容器的数据,B请求的线程处理B容器的数据,而不会混淆。

示例如下:


 1 package ch03;
2
3 import java.util.Random;
4
5 public class ThreadLocalTest {
6
7 public static void main(String[] args) {
8 Thread th = null;
9 for(int i=0; i<2; i++){
10 th = new Thread(new Runnable() {
11 @Override
12 public void run() {
13 int data = new Random().nextInt();
14 System.out.println(Thread.currentThread().getName()+"\t"+data);
15 Request request = Request.getThreadInstance();
16 request.setName("name:"+data);
17 request.setAge(data);
18
19 //输出两个模块的值
20 new A().get();
21 new B().get();
22 }
23 });
24 th.start();
25 }
26 }
27
28 /*A模块*/
29 static class A{
30 public void get(){
31 Request request = Request.getThreadInstance();
32 System.out.println("A: "+Thread.currentThread().getName()+"\t"+
33 request.getName()+"\t"+request.getAge());
34 }
35 }
36 /*B模块*/
37 static class B{
38 public void get(){
39 Request request = Request.getThreadInstance();
40 System.out.println("B: "+Thread.currentThread().getName()+"\t"+
41 request.getName()+"\t"+request.getAge());
42 }
43 }
44
45 }
46
47 class Request{
48
49 private Request(){}
50
51 /*ThreadLocal:将变量与当前线程绑定,相当于Map<Thread, value>*/
52 private static ThreadLocal<Request> instance = new ThreadLocal<>();
53 /*返回当前线程的单例*/
54 public static Request getThreadInstance(){
55 Request request = instance.get();
56 if(request == null){
57 request = new Request();
58 instance.set(request);
59 }
60 return request;
61 }
62
63 private String name;
64 private int age;
65
66 public String getName() {
67 return name;
68 }
69 public void setName(String name) {
70 this.name = name;
71 }
72 public int getAge() {
73 return age;
74 }
75 public void setAge(int age) {
76 this.age = age;
77 }
78
79 }

输出结果:

 

ThreadLocal实现线程范围内共享变量,布布扣,bubuko.com

时间: 2024-10-26 01:40:16

ThreadLocal实现线程范围内共享变量的相关文章

线程范围内共享变量的概念与作用演进方式

/** * * @描述: 线程范围内共享变量的概念与作用 . * @作者: Wnj . * @创建时间: 2017年5月15日 . * @版本: 1.0 . */ public class ThreadLocalTest { private static ThreadLocal<Integer> x = new ThreadLocal<Integer>(); private static ThreadLocal<MyThreadScopeData> myThreadSc

线程范围内共享变量的概念与作用

package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * * @描述: 线程范围内共享变量的概念与作用 . * @作者: Wnj . * @创建时间: 2017年5月15日 . * @版本: 1.0 . */ public class ThreadScopeShareData { // private static int data = 0; p

JAVA多线程提高三:线程范围内共享变量&amp;ThreadLocal

今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run()方法里面执行Thread.currentThread()都会对应当前Runnable对应的线程,因此A.B中对应的Thread.currentThread

ThreadLocal实现线程范围的共享变量

ThreadLocal用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据. 每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值,在线程结束时可以调用ThreadLocal.clear()方法,这样会更快释放内存,不调用也可以,因为线程结束后也可以自动释放相关的ThreadLocal变量. ThreadLocal

5.线程范围内共享变量的概念与作用

1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Random; 4 5 /******************************* 6 * 模拟ThrealLocal的实现 7 * 用处: 8 * 用在数据库操作中俄beginTransaction -> commit 9 * 在Hibernate中也是使用它来保证在多线程下Session自己不冲突. 10 * OpenSessionInView模

(黑马Java多线程与并发库高级应用)05 线程范围内共享变量的概念与作用

如下代码中会出现问题 package cn.itcast.heima2; import java.util.HashMap; import java.util.Random; public class ThreadScopeShareData { private static int data = 0; private static HashMap<Thread, Integer> threadData = new HashMap<>(); public static void m

Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类

1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, Integer> dataMap = new HashMap<Thread, Integer>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable

ThreadLocal实现:java线程范围内的共享数据,线程外独立

场景应用:银行转账时,A给B转账,C给D转账.两者都是调用的connection.begainTransaction();connection.commit(); 如何才能保证A,B同在一个线程中,C.D同在一个线程中,且A,BC,D在线程内共享,在线程外独立. 方法一,Map<Thread, Integer>实现: /** * 线程范围内的共享数据 */ package cn.itcast.lesson5; import java.util.HashMap; import java.util

4、线程范围内的数据共享之ThreadLocal

1 /** 2 * 线程范围类的数据共享 3 * 核心:ThreadLocal类 4 * 实际场景: 5 * Hibernate的getCurrentSession方法,就是从线程范围内获取存在的session,如果不存在则新建一个并绑定到线程上 6 * struts将一个请求里的所有参数绑定到一个线程范围内的对象里 7 * @author yzl 8 * 9 */ 10 public class ThreadPart_4 { 11 public static void main(String[