Java线程取错值

问题描述 投票:0回答:1

作为ThreadLocal实现的一部分,我创建了两个线程,并将每个线程上下文存储在 UserContextHolder. 线程 -0 储值 A主题-1 储值 B.但在里面执行代码时 getAge(String name) 方法,我总是得到 线程-10号线 有价值 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

java multithreading thread-safety java-threads
1个回答
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

所以我建议你检查一下你的输出中是否漏掉了第三个值。

© www.soinside.com 2019 - 2024. All rights reserved.