作为ThreadLocal实现的一部分,我创建了两个线程,并将每个线程上下文存储在 UserContextHolder. 线程 -0 储值 A 和 主题-1 储值 B.但在里面执行代码时 getAge(String name) 方法,我总是得到 线程-1 和 0号线 有价值 A 始终.我已经申请 同步 方法的关键字,但没有用,请帮我解决这个问题。A 而另一线程有价值 B在这里我也给出完整的代码。
用户 是一个POJO类,属性为Age和Number。
public class ThreadLocalDemo2 {
public List<User> userList =new ArrayList<>();
public static void main(String[] args) {
new Thread(()->{
new ServiceSet().process("A");
new ServiceGet().process();
}).start();
new Thread(()->{
new ServiceSet().process("B");
new ServiceGet().process();
}).start();
}
public ThreadLocalDemo2(){
User user1=new User("A",21);
userList.add(user1);
User user2=new User("B",22);
userList.add(user2);
}
public User getObject(String name){
for(User user : userList){
System.out.println("user.getName() : "+user.getName() +" Thread Name "+Thread.currentThread().getName() );
if (user.getName()==name)
return user;
}
return null;
}
}
class ServiceSet{
public void process(String name){
ThreadLocalDemo2 th=new ThreadLocalDemo2();
User user=th.getObject(name);
UserContextHolder.holder.set(user);
}
}
class ServiceGet{
public void process(){
User user= UserContextHolder.holder.get();
}
}
class UserContextHolder {
public static ThreadLocal<User> holder=new ThreadLocal<>();
}
輸出
user.getName() : 一个线程名称 Thread-1。
user.getName() : 一个线程名称 Thread-0。
预期产出
user.getName() : 一个线程名称 Thread-1。
user.getName() : B 线程名称 Thread-0
我不知道你想达到什么目的,但是,你的方法getAge只是简单地打印了所有的用户名,从 用户列表所以我宁愿期待这样的东西。
user.getName() : A Thread Name Thread-1 //first iteration printing
user.getName() : A Thread Name Thread-0 //second iteration
user.getName() : B Thread Name Thread-0 //like above, second iteration
我甚至在本地试过你的代码,结果是这样的:
user.getName() : A Thread Name Thread-2
user.getName() : A Thread Name Thread-3
user.getName() : B Thread Name Thread-3
所以我建议你检查一下你的输出中是否漏掉了第三个值。