java 之 ThreadLocal学习

原创 2012年03月21日 14:08:37
import java.util.Random;

public class ThreadLocalTest {

	//一个threadlocal代表一个变量
	private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
	private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();	
	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);
					x.set(data);
					
					MyThreadScopeData myData = new MyThreadScopeData();
					myData.setName("name"+data);
					myData.setAge(data);
					myThreadScopeData.set(myData);
					new A().get();
					new B().get();
				}
				
			}).start();
		}
	}
	static class A {
		public void get() {
			int data = x.get();
			
			System.out.println("A from  "+Thread.currentThread().getName()+" get data : " +data);
			
			MyThreadScopeData myData = myThreadScopeData.get();
			System.out.println("A from "+Thread.currentThread().getName()+  " get mydata ["+myData.getName()+"---"+myData.getAge()+"]");
		}
	}
	
	static class B {
		public void get() {
			int data = x.get();
			System.out.println("B from  "+Thread.currentThread().getName()+" get data : " +data);
			
			MyThreadScopeData myData = myThreadScopeData.get();
			System.out.println("A from "+Thread.currentThread().getName()+  " get mydata ["+myData.getName()+"---"+myData.getAge()+"]");
		}
	}
}

/**
 * threadLocal存储多个变量,封装成一个实体
 * @author ETHAN
 *
 */
class MyThreadScopeData {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

运行结果:

Thread-0 has put data :1763666590
Thread-1 has put data :1672527073
A from  Thread-0 get data : 1763666590
A from Thread-0 get mydata [name1763666590---1763666590]
A from  Thread-1 get data : 1672527073
A from Thread-1 get mydata [name1672527073---1672527073]
B from  Thread-0 get data : 1763666590
B from  Thread-1 get data : 1672527073
A from Thread-0 get mydata [name1763666590---1763666590]
A from Thread-1 get mydata [name1672527073---1672527073]

import java.util.Random;

public class ThreadLocalTest2 {

	//一个threadlocal代表一个变量
	private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
	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);
					x.set(data);
					
					MyThreadScopeData2.getInstance().setName("name"+data);
					MyThreadScopeData2.getInstance().setAge(data);
					new A().get();
					new B().get();
				}
				
			}).start();
		}
	}
	static class A {
		public void get() {
			int data = x.get();
			
			System.out.println("A from  "+Thread.currentThread().getName()+" get data : " +data);
			
			MyThreadScopeData2 myData = MyThreadScopeData2.getInstance();
			System.out.println("A from "+Thread.currentThread().getName()+  " get mydata ["+myData.getName()+"---"+myData.getAge()+"]");
		}
	}
	
	static class B {
		public void get() {
			int data = x.get();
			System.out.println("B from  "+Thread.currentThread().getName()+" get data : " +data);
			
			MyThreadScopeData2 myData = MyThreadScopeData2.getInstance();
			System.out.println("A from "+Thread.currentThread().getName()+  " get mydata ["+myData.getName()+"---"+myData.getAge()+"]");
		}
	}
}

/**
 * threadLocal存储多个变量,封装成一个实体
 * 这就是一个容器,装着个各线程的变量,比如struts2
 * 线程死掉后,value remove()
 * 线程何时死亡,不可知
 * 如果线程结束了,ThreadLocal会自动remove
 * @author ETHAN
 *
 */
class MyThreadScopeData2 {
	private static ThreadLocal<MyThreadScopeData2> map = new ThreadLocal<MyThreadScopeData2>();
	
	private MyThreadScopeData2() {}
	//threadLocal每个线程 取各自的,不相干
	public static /*synchronized*/ MyThreadScopeData2 getInstance()  {
		//从threadlocal中拿
		MyThreadScopeData2 instance= map.get();
		if(instance==null) {
			instance = new MyThreadScopeData2();
			map.set(instance);
		} 
		
		return instance;
	}
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

运行结果:

Thread-0 has put data :703649381
Thread-1 has put data :1447231087
A from  Thread-0 get data : 703649381
A from  Thread-1 get data : 1447231087
A from Thread-0 get mydata [name703649381---703649381]
A from Thread-1 get mydata [name1447231087---1447231087]
B from  Thread-0 get data : 703649381
B from  Thread-1 get data : 1447231087
A from Thread-0 get mydata [name703649381---703649381]
A from Thread-1 get mydata [name1447231087---1447231087]

[Java并发包学习七]解密ThreadLocal

概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程...
  • hechurui
  • hechurui
  • 2015年10月30日 11:18
  • 1983

并发编程之ThreadLocal、Volatile、synchronized、Atomic关键字扫盲

前言对于ThreadLocal、Volatile、synchronized、Atomic这四个关键字,我想一提及到大家肯定都想到的是解决在多线程并发环境下资源的共享问题,但是要细说每一个的特点、区别、...
  • u010687392
  • u010687392
  • 2016年01月21日 10:25
  • 6848

Java 之 ThreadLocal学习

ThreadLocal : 每个线程中保留一份自己的变量副本,避免引起数据同步问题。代码如下: public class Student { private int age=0; public...
  • EthanQ
  • EthanQ
  • 2011年12月26日 22:27
  • 292

Java学习记录--ThreadLocal使用案例

java学习记录–ThreadLocal使用案例标签(空格分隔): java最近整理公司项目,发现不少写的比较糟糕的地方,比如下面这个:public class DateUtil { priva...
  • u012706811
  • u012706811
  • 2016年11月19日 16:26
  • 1819

【Java并发编程】深入分析ThreadLocal(八)

我们在使用一个类时,首先要知道它能做什么,然后再去深入分析它的工作原理。ThreadLocal如果从名字上来看像是“本地线程"的意思,其实ThreadLocal并不是一个线程,而是线程的局部变量。当使...
  • liulongling
  • liulongling
  • 2016年01月29日 15:56
  • 3828

深入学习理解java-ThreadLocal

ThreadLocal是什么?有什么用?怎么用? 1。ThreadLocal是什么 带着这样的问题我们来学习一下java并发编程中的一个重要的角色分子ThreadLocal。 早在JDK 1.2...
  • baidu_23086307
  • baidu_23086307
  • 2017年02月23日 16:05
  • 2206

ThreadLocal父子线程传递实现方案

前言 介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:ThreadLocal源码分析解密.在讲解...
  • a837199685
  • a837199685
  • 2016年09月30日 17:06
  • 5815

java 深入理解ThreadLocal

相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的...
  • mccand1234
  • mccand1234
  • 2017年01月07日 13:49
  • 935

Java ThreadLocal解决线程安全问题

TLS:Thread Local Storage   转载自http://blog.csdn.net/jiht594/article/details/6606326  TLS全称为Thread L...
  • bestcxx
  • bestcxx
  • 2017年02月10日 23:11
  • 610

Java-ThreadLocal的简单例子

内容:ThreadLocal:允许我们创建只能被同一个线程读写的变量,例如Web应用中将变量从前端到后台,并且需要在这次请求的线程中始终可以随时获取到。内部实现是通过一个ThreadLocalMap这...
  • u011345136
  • u011345136
  • 2015年06月02日 22:53
  • 1436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 ThreadLocal学习
举报原因:
原因补充:

(最多只允许输入30个字)