Java ThreadLocal类

ThreadLocal类用于创建只能由同一个线程读取和写入的线程局部变量。 例如,如果两个线程正在访问引用相同threadLocal变量的代码,那么每个线程都不会看到任何其他线程操作完成的线程变量。

1 ThreadLocal的方法

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

方法 描述
public T get() 返回当前线程的线程局部变量的副本中的值。
protected T initialValue() 返回此线程局部变量的当前线程的“初始值”。
public void remove() 删除此线程局部变量的当前线程的值。
public void set(T value) 将当前线程的线程局部变量的副本设置为指定的值。

2 ThreadLocal的案例

以下TestThread程序演示了ThreadLocal类的上面一些方法。 这里我们使用了两个计数器(counter)变量,一个是常量变量,另一个是ThreadLocal变量。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
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: 4
Counter: 3
threadLocalCounter: 0
threadLocalCounter: 0

您可以看到变量(counter)的值由每个线程增加,但是ThreadLocalCounter对于每个线程都保持为0。
 

热门文章

优秀文章