多线程全局变量的问题
public class TestThread extends Thread{
A a;
public TestThread(A a) {
this.a = a;
}
public static void main(String[] args) {
A a = new A("0");
for(int i=0; i < 5; i++){
Thread t = new TestThread(a);
t.start();
}
System.out.println("主线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
System.out.println("主线程
[解决办法]
变量
[解决办法]
"+a.myparam);
new B(a).start();
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
System.out.println("主线程
[解决办法]
变量
[解决办法]
"+a.myparam);
}
public void run() {
a.threadSession.set(a.myparam);
for(int i=0; i < 5; i++){
System.out.println("消费线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
System.out.println("消费线程
[解决办法]
变量
[解决办法]
"+a.myparam);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class A{
ThreadLocal threadSession = new ThreadLocal();
String myparam = "";
public A(String myparam) {
this.myparam = myparam;
}
}
class B extends Thread{
A a;
public B(A a) {
this.a = a;
}
public void run() {
try {
Thread.sleep(700);
System.out.println("修改线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
System.out.println("修改线程
[解决办法]
变量
[解决办法]
"+a.myparam);
a.myparam = "333";
a.threadSession.set("bbbbb");
System.out.println("修改线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
System.out.println("修改线程
[解决办法]
变量
[解决办法]
"+a.myparam);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
修改线程
[解决办法]
ThreadLocal
[解决办法]
null
修改线程
[解决办法]
变量
[解决办法]
0
修改线程
[解决办法]
ThreadLocal
[解决办法]
bbbbb
修改线程
[解决办法]
变量
[解决办法]
333
主线程
[解决办法]
ThreadLocal
[解决办法]
null
主线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
------解决方案--------------------
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
从结果可以看出对于同一个实例a,每个线程myparam变量是同一个,一个线程改变了,所有线程都会受到影响。
每个线程threadSession都不是一个,互相不受影响,set()只会影响本线程。
代码写的很不规范,请见谅。你的打印路径是因为存到a.myparam才会被改变的,放到ThreadLocal就可以了,希望能帮到你。