【问题标题】:Threadlocal of a thread is accessible to main thread主线程可以访问线程的 Threadlocal
【发布时间】:2019-05-05 03:46:13
【问题描述】:

主线程如何访问另一个线程的threadlocal?尽管另一个线程的 threadlocal 在主线程中给出的值与它在自己的 run 方法中给出的值不同。

class MyThread13 extends Thread{
    static int id =0;
     ThreadLocal threadLocal = new ThreadLocal(){
       public Integer initialValue(){
            return ++id;
        }
    };
    public MyThread13(String name){
        super(name);
    }
    public void run(){
        System.out.println(Thread.currentThread().getName()+" is executing with id :"+threadLocal.get());

    }

}

public class MultiThreading13ThreadLocalB {
    public static void main(String[] args) {
        MyThread13 myThread13a = new MyThread13("Thread:1");
        MyThread13 myThread13b = new MyThread13("Thread:2");
        myThread13a.start();
        myThread13b.start();
        myThread13c.start();
       // myThread13d.start();
        System.out.println("Accessing threadlocal from main :"+myThread13a.threadLocal.get());

    }
}

当从主线程访问另一个线程的threadlocal时,它应该给null。但在这里它给出了一些其他的价值

【问题讨论】:

    标签: java multithreading thread-local


    【解决方案1】:

    您的示例显示了 ThreadLocalThread 实例的简单成员变量的混淆。概念相似;两者都允许您将状态与Thread 实例相关联,但ThreadLocal 允许您在线程实例本身之外执行此操作。正如您所指出的,ThreadLocal 名副其实 - 当您在其上调用 getset 时,这些值是 特定于该线程的,这就是为什么尝试访问另一个线程的状态(正如您的示例中的主线程尝试做的那样)将不起作用。

    ThreadLocals 有时很有帮助,但在日常编程中很少需要它们。一种用例类似于接受传入请求并将某些状态与该请求相关联的服务器进程;如果您不想更改所有方法签名以传递该状态,则可以将其放在ThreadLocal 中。通常每个 JVM 有一个 ThreadLocal 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多