Java 并发 - ThreadLocal 类



ThreadLocal 类用于创建线程局部变量,这些变量只能由同一个线程读取和写入。例如,如果两个线程访问包含对同一个 ThreadLocal 变量的引用的代码,那么每个线程都不会看到其他线程对 ThreadLocal 变量所做的任何修改。

ThreadLocal 方法

以下是 ThreadLocal 类中可用的一些重要方法列表。

序号 方法及描述
1

public T get()

返回当前线程在此线程局部变量的副本中的值。

2

protected T initialValue()

返回当前线程在此线程局部变量的“初始值”。

3

public void remove()

删除当前线程在此线程局部变量的值。

4

public void set(T value)

将当前线程在此线程局部变量的副本设置为指定值。

示例

以下 TestThread 程序演示了 ThreadLocal 类的一些方法。在这里,我们使用了两个计数器变量,一个是普通变量,另一个是 ThreadLocal 变量。

class RunnableDemo implements Runnable {
   int counter;
   ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();

   public void run() {     
      counter++;

      if(threadLocalCounter.get() != null) {
         threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
      } else {
         threadLocalCounter.set(0);
      }
      System.out.println("Counter: " + counter);
      System.out.println("threadLocalCounter: " + threadLocalCounter.get());
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo commonInstance = new RunnableDemo();

      Thread t1 = new Thread(commonInstance);
      Thread t2 = new Thread(commonInstance);
      Thread t3 = new Thread(commonInstance);
      Thread t4 = new Thread(commonInstance);

      t1.start();
      t2.start();
      t3.start();
      t4.start();

      // wait for threads to end
      try {
         t1.join();
         t2.join();
         t3.join();
         t4.join();
      } catch (Exception e) {
         System.out.println("Interrupted");
      }
   }
}

这将产生以下结果。

输出

Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0

您可以看到 counter 的值被每个线程递增,但 threadLocalCounter 对于每个线程都保持为 0。

广告