ThreadLocal的疑问,不是为每一个使用该变量的线程都提供一个变量值的副本吗?
public class ThreadLocalTest {
public static void main(String[] args) {
Account account = new Account("初始名");
new MyTest(account,"线程甲").start();
new MyTest(account,"线程乙").start();
}
}
class Account{
private ThreadLocal<String> name = new ThreadLocal<String>();
public String getName(){
return name.get();
}
public void setName(String str){
this.name.set(str);
}
public Account(String str){
this.name.set(str);
System.out.println("---"+this.name.get());
}
}
class MyTest extends Thread{
private Account account;
public MyTest(Account account,String name){
super(name);
this.account = account;
}
@Override
public void run() {
for(int i=0;i<10;i++){
if(i==6){
account.setName(getName());
}
System.out.println(account.getName()+"账户i的值为:"+i);
}
}
}
程序输出为:

当然输出不一定每次都是这样,因为线程调度不可控。我的问题是为什么线程甲乙开始时account.getName()的值为null呢?在main函数里account已经被构造出来了,构造函数里已经有name.set("初始名")了,两个子线程所持有的account的副本应该从一开始name的值就为“初始名”啊,为什么开始是null呢?我哪里理解错了呢?求指导
...全文
相关推荐
Java多线程编程之ThreadLocal线程范围内的共享变量
Java中的ThreadLocal是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。
ThreadLocal线程变量副本概念问题
当一个线程中调用一个ThreadLocal对象时,它会获取该线程的独立变量副本,并在该副本上进行操作,从而避免了线程安全问题。具体来说,当一个线程调用ThreadLocal对象的get()方法时,它会获取该线程的独立变量副本,并返回该副本的值。当一个线程调用ThreadLocal对象的set()方法时,它会获取该线程的独立变量副本,并在该副本上设置新的值。因此,不同线程之间的变量值是相互独立的,互不干扰。下面是一个示例,展示了如何在一个线程中调用。
java线程本地变量ThreadLocal详解
ThreadLocal 的主要目的是为每个线程提供一个变量副本,从而隔离了多个线程访问数据的冲突。
ThreadLocal应用示例及理解
ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。
ThreadLocal跨线程问题
"ThreadLocal在多线程环境中的使用与局限性"ThreadLocal是Java中一个非常有用的工具类,它提供了线程局部变量,每个线程都有独立的副本,不会互相干扰。然而,在复杂的处理流程中


Java SE
