先说明问题:先让每个线程都有自己线程范围内的共享变量
package com.xiaozhi.threadlocal;
import java.util.Random;
public class Test {
private static int data=0;
public static void main(String[] args) {
new Thread(){
public void run() {
data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
new Thread(){
public void run() {
data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}
static class A{
public void get()
{
System.out.println(Thread.currentThread().getName()+"new A().get():"+data);
}
}
static class B{
public void get()
{
System.out.println(Thread.currentThread().getName()+"new B().get():"+data);
}
}
}
用Map实现每个线程都有自己线程范围内的共享变量
package com.xiaozhi.threadlocal;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Test1 {
private static Map<Thread,Integer>map=new HashMap<Thread, Integer>();
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
map.put(Thread.currentThread(),data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
new Thread(){
public void run() {
int data=new Random().nextInt();
map.put(Thread.currentThread(),data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}
static class A{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+map.get(Thread.currentThread()));
}
}
static class B{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+map.get(Thread.currentThread()));
}
}
}
package com.xiaozhi.threadlocal;
import java.util.Random;
public class Test2 {
private static ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>();
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
threadLocal.set(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
new Thread(){
public void run() {
int data=new Random().nextInt();
threadLocal.set(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}
static class A{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+threadLocal.get());
}
}
static class B{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+threadLocal.get());
}
}
}
ThreadLocal装对象
package com.xiaozhi.threadlocal;
import java.util.Random;
public class Test3 {
private static ThreadLocal<Person> threadLocal=new ThreadLocal<Person>();
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=new Person();
person.setName("xiaozhi"+data);
person.setAge(data);
threadLocal.set(person);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=new Person();
person.setName("xiaozhi"+data);
person.setAge(data);
threadLocal.set(person);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}
static class A{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+threadLocal.get().getName()+":"+threadLocal.get().getAge());
}
}
static class B{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+threadLocal.get().getName()+":"+threadLocal.get().getAge());
}
}
}
class Person{
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;
}
}
更优雅的代码
package com.xiaozhi.threadlocal2;
import java.util.Random;
public class Test4 {
public static void main(String[] args) {
new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=Person.getPersonInstance();
person.setName("xiaozhi"+data);
person.setAge(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
new Thread(){
public void run() {
int data=new Random().nextInt();
Person person=Person.getPersonInstance();
person.setName("xiaozhi"+data);
person.setAge(data);
System.out.println(Thread.currentThread().getName()+":"+data);
new A().get();
new B().get();
}
}.start();
}
static class A{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new A().get():"+ Person.getPersonInstance().getName()+":"+ Person.getPersonInstance().getAge());
}
}
static class B{
public void get()
{
System.out.println(Thread.currentThread().getName()+"--------------new B().get():"+ Person.getPersonInstance().getName()+":"+ Person.getPersonInstance().getAge());
}
}
}
class Person{
private Person(){}
private static ThreadLocal<Person> threadLocal=new ThreadLocal<Person>();
public static Person getPersonInstance()
{
Person person=threadLocal.get();
if(person==null)
{
person=new Person();
threadLocal.set(person);
}
return person;
}
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;
}
}