【问题标题】:ThreadLocal in javajava中的ThreadLocal
【发布时间】:2014-05-12 01:12:36
【问题描述】:

这是 ThreadLocal 使用的 java doc 中的示例。

public class ThreadId {
 // Atomic integer containing the next thread ID to be assigned
 private static final AtomicInteger nextId = new AtomicInteger(0);

 // Thread local variable containing each thread's ID
 private static final ThreadLocal<Integer> threadId =
     new ThreadLocal<Integer>() {
         @Override protected Integer initialValue() {
             return nextId.getAndIncrement();
     }
 };

 // Returns the current thread's unique ID, assigning it if necessary
 public static int get() {
     return threadId.get();
 }
 }

我不明白为什么我们在这里使用 threadlocal。 AtomicInteger 不是已经线程安全了吗?

把代码改成这个怎么样?

public class ThreadId {
 // Atomic integer containing the next thread ID to be assigned
 private static final AtomicInteger nextId = new AtomicInteger(0);

 // Returns the current thread's unique ID, assigning it if necessary
 public static int get() {
     return nextId.getAndIncrement();
 }
 }

我也不明白这是什么意思:

这些变量与普通变量的不同之处在于,每个访问一个(通过其 get 或 set 方法)的线程都有自己的、独立初始化的变量副本。

那么,ThreadLocal(内部)是否为每个线程保存一个整数数组? Java_concurrency 在实践中提到我们可以将 threadLocal 视为 Map。

提前致谢。

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    注意所有这些变量是如何声明为静态的。这意味着通常只有一个。

    为了使 threadId 线程特定,我们使用 threadlocal。这意味着现在每个线程将有一个实例,而不是只有一个实例。

    在您的版本中,每次我们调用 get() 都会返回一个不同的数字。

    在原始版本中,第一次调用 get 时,它将自行初始化并将值保存在线程上。每次后续调用都将返回此值以获取该线程。

    你的代码

    //in thread 0
    ThreadId.get() //return 0
    //in thread 1
    ThreadId.get() //return 1
    //in thread 0
    ThreadId.get() //return 2
    //in thread 1
    ThreadId.get() //return 3
    //in thread 0
    ThreadId.get() //return 4
    

    原代码

    //in thread 0
    ThreadId.get() //return 0
    //in thread 1
    ThreadId.get() //return 1
    //in thread 0
    ThreadId.get() //return 0
    //in thread 1
    ThreadId.get() //return 1
    //in thread 0
    ThreadId.get() //return 0
    

    【讨论】:

    • 谢谢!这很有见地。
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 2013-03-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2016-02-28
    • 2017-07-06
    • 2016-05-12
    相关资源
    最近更新 更多