k = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " put value to i " + k);
new A().get();
new B().get();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
//模块A
static class A {
public void get() {
System.out.println("A from " +Thread.currentThread().getName() + " get value "+ k);
}
}
//模块B
static class B {
public void get() {
System.out.println("A from " +Thread.currentThread().getName() + " get value "+ k);
}
}
现在我们需要这样的效果,假设线程0给i赋值为1,那么当线程0取的时候也是1,也就是说线程之间取各自放进去的值.而上面的程序达不到这样的要求. 这就需要线程范围内的数据共享.
那么我们可以这样来实现,这也是线程范围内数据共享的原理.
定义一个Map集合key和value分别为Thread和Integer.
把给i赋值的代码替换为
int k =new Random().nextInt();
map.put(Thread.currentThread(), k);
get()方法内的代码改为
System.out.println("A from " + Thread.currentThread().getName()
+ " get value " + map.get(Thread.currentThread()));
这样的话就实现了线程范围内的数据共享了,线程取得值是各自放进去的.
这有什么用呢 比如事务,所谓事务的回滚和提交指的是在一个线程上的,如果是在不同的线程上,那么逻辑就乱了.这不是我们想要的,这样的话我们就可以通过线程范围内共享数据,也就是把连接绑定到该线程上,那么在该线程获取的连接是同一个连接.
下面通过ThreadLocal来实现这样的功能.
[java]
public class ThreadLocalTest {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int k = new Random().nextInt();
ThreadShareData.getThreadShareData().setAge(k);
ThreadShareData.getThreadShareData().setName("name" + k);
System.out.println(Thread.currentThread().getName()
+ " put value to i " + k);
new A().get();
new B().get();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
// 模块A
static class A {
public void get() {
ThreadShareData data = ThreadShareData.getThreadShareData();
System.out.println("A from " + Thread.currentThread().getName()
+ " get value " + data.getName() + "--" + data.getAge());
}
}
// 模块B
static class B {
public void get() {
ThreadShareData data = ThreadShareData.getThreadShareData();
System.out.println("B from " + Thread.currentThread().getName()
+ " get value " + data.getName() + "--" + data.getAge());
}
}
}
class ThreadShareData {
private static ThreadLocal
local = new ThreadLocal
();
private ThreadShareData() {
}
public static ThreadShareData getThreadShareData() {
ThreadShareData data = local.get();
if (data == null) {
data = new ThreadShareData();
local.set(data);
}
return data;
}
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 set