1.线程能共享数据
线程内部要用到线程外的一个变量
package com.lgc;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareData {
private static int data = 0;
public static void main(String[] args) {
for(int i=0;i<3;i++){
new Thread(new Runnable(){
@Override
public void run() {
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " has put data :" + data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{
public void get(){
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}
out:
Thread-0 has put data :1708994183
Thread-1 has put data :-112088840
A from Thread-0 get data :-112088840
A from Thread-1 get data :-112088840
B from Thread-0 get data :-112088840
B from Thread-1 get data :-112088840
线程0放了一个 data 1708994183 ,当他后面要用data 取出来的却是112088840 ,在一个类里当然可以设个局部变量用来缓存。
要想任何属于这个线程的类都能取到正确的data怎么解决?
线程内共享变量
package com.lgc;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareData {
private static int data = 0;
private static Map<Thread, Integer> threadData = new HashMap<Thread, 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);
threadData.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
int data = threadData.get(Thread.currentThread());
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{
public void get(){
int data = threadData.get(Thread.currentThread());
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}
out:
Thread-0 has put data :1156068854
Thread-1 has put data :-347154499
A from Thread-0 get data :1156068854
A from Thread-1 get data :-347154499
B from Thread-0 get data :1156068854
B from Thread-1 get data :-347154499
JDK提供的ThreadLocal就相当于这里的threadData,这就是ThreadLocal解决的问题。
ThreadLocal实现上述问题代码
public class ThreadLocalTest {
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);
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);
}
}
static class B{
public void get(){
int data = x.get();
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}
2. ThreadLocal的另一个应用(线程内单例模式)
class MyThreadScopeData{
private MyThreadScopeData(){}
public static MyThreadScopeData getThreadInstance(){
MyThreadScopeData instance = map.get();
if(instance == null){
instance = new MyThreadScopeData();
map.set(instance);
}
return instance;
}
private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
}