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使用案例

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

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

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

JAVA并发学习之ThreadLocal

关于java并发编程的相关文章都是阅读了《java并发编程实战》之后的读书笔记总结 概述ThreadLocal其实是线程封闭的一种规范化的实现,它通过提供一组get和set的接口为每个使用该变量的线程...

java-ThreadLocal学习记录

看了各路大神总结关于ThreadLocal的知识, 我也做了相关笔记, 然后在这里记录, 方便后面生疏之后再次学习.1.基本概念ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持...

《Java高并发程序设计》学习 --4.3 ThreadLocal

3. ThreadLocal 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对...

Java学习整理系列之ThreadLocal的理解

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问...

JAVA学习之路---ThreadLocal

ThreadLocal作用存储当前线程对应的变量,方便使用,不至于像传递参数那样传递下去,多个线程直线对应的变量互补影响。 例子1:比如我们在控制器层通过ThreadLocal的set方法将sess...

深入学习理解java-ThreadLocal

ThreadLocal是什么?有什么用?怎么用? 1。ThreadLocal是什么 带着这样的问题我们来学习一下java并发编程中的一个重要的角色分子ThreadLocal。 早在JDK 1.2...

【Java】关于ThreadLocal的研究与学习

什么是ThreadLocal ThreadLocal一般称为 线程本地变量, 它是一种特殊的线程绑定机制,将变量与线程 绑定 在一起,为每一个线程维护一个独立的变量副本。通过ThreadLoca...
  • hj7jay
  • hj7jay
  • 2016年12月26日 10:15
  • 191

学习Spring必学的Java基础知识(6)----ThreadLocal

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”。以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 ThreadLocal学习
举报原因:
原因补充:

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