public class ThreadLocalTest {
private static ThreadLocal<Student> logs = new ThreadLocal<Student>();
public static void main(String[] args) throws InterruptedException {
// ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
Student student = logs.get();
if (student == null) {
student = new Student();
logs.set(student);
}
System.out.println(Thread.currentThread().getName() + "..." + student);
}
}).start();
}
}
}class Student {
}按道理来说,使用线程局部变量,每个线程都会创建一个自己独有的Student对象,但是跑出来为啥偶尔会出现(如下):
Thread-1...com.thread.Student@3fbefab0
Thread-0...com.thread.Student@3fbefab0
Thread-3...com.thread.Student@133c5982
Thread-2...com.thread.Student@3d4b7453
Thread-4...com.thread.Student@133c5982
两个线程中出现了相同的对象地址,指向同一个对象,这是为什么,是代码哪里有问题吗?求指教。
private static ThreadLocal<Student> logs = new ThreadLocal<Student>();
public static void main(String[] args) throws InterruptedException {
// ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
Student student = logs.get();
if (student == null) {
student = new Student();
logs.set(student);
}
System.out.println(Thread.currentThread().getName() + "..." + student);
}
}).start();
}
}
}class Student {
}按道理来说,使用线程局部变量,每个线程都会创建一个自己独有的Student对象,但是跑出来为啥偶尔会出现(如下):
Thread-1...com.thread.Student@3fbefab0
Thread-0...com.thread.Student@3fbefab0
Thread-3...com.thread.Student@133c5982
Thread-2...com.thread.Student@3d4b7453
Thread-4...com.thread.Student@133c5982
两个线程中出现了相同的对象地址,指向同一个对象,这是为什么,是代码哪里有问题吗?求指教。
楼主这里明显是logs.set的关系,5个线程肯定速度不一致,有的线程有延时所以在logs.get时获取其他线程的student值,不会创建新的Student
用newthread不可能出这个问题的
处理的办法,就是在每个线程执行完后,对ThreadLocal中的这个student做清空处理
ThreadLocal.remove();
ThreadLocal<Date> threadLocal = new ThreadLocal<>(){
@Override
protected Date initialValue() {
return new Date();
}
};