线程范围变量共享
案例
创建两个线程,用于产生一个随机数,另外,A,B两个模块去获取这个数据,程序如下:
public class ThreadsShareData {
protected static int shareData;
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
public void run() {
shareData = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + " generate a random data:" + shareData);
new A().get();
new B().get();
}
}).start();
}
}
static class A {
public void get(){
System.out.println("A from " + Thread.currentThread().getName() + " get data: " + shareData);
}
}
static class B {
public void get(){
System.out.println("B from " + Thread.currentThread().getName() + " get data: " + shareData);
}
}
}
执行结果
以上看出,多个模块在多个线程中调用的其实是同一个数据,怎么才能在第一个线程中保证A,B线程调用的是同一份,第二个线程调用的是同一个,而两个线程之间的数据是独立的?
public class ThreadsShareData {
protected static Map<Thread,Integer> map = new HashMap<Thread, Integer>();
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
public void run() {
// shareData = new Random().nextInt();
map.put(Thread.currentThread(),new Random().nextInt());
System.out.println(Thread.currentThread().getName() + " generate a random data:" + map);
new A().get();
new B().get();
}
}).start();
}
}
static class A {
public void get(){
System.out.println("A from " + Thread.currentThread().getName() + " get data: " + map.get(Thread.currentThread()));
}
}
static class B {
public void get(){
System.out.println("B from " + Thread.currentThread().getName() + " get data: " + map.get(Thread.currentThread()));
}
}
}
总结
线程范围内多个模块,要做到线程范围内数据共享,线程外独立,就和数据库中的转入转出一样, 转入转出方法用到的同一个余额变量,但是他们更新数据库的connection是在线程范围内的,一个线程内一个connection