6 Java并发ThreadLocal类

作者: 笑Skr人啊 | 来源:发表于2017-08-31 11:15 被阅读71次

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

    线程方法

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

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

    实例

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

    package ThreadMethod;
    
    /*
     * public T get()   返回当前线程的线程局部变量的副本中的值。
    2   protected T initialValue()  返回此线程局部变量的当前线程的“初始值”。
    3   public void remove()    删除此线程局部变量的当前线程的值。
    4   public void set(T value)    将当前线程的线程局部变量的副本设置为指定的值。
     */
    
    class RunnableTest 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 ThreadLocalTest {
    
        public static void main(String args[]) {
            RunnableTest commonInstance = new RunnableTest();
    
            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");
            }
        }
    }
    

    以DEBUG方式按步骤运行

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

    相关文章

      网友评论

        本文标题:6 Java并发ThreadLocal类

        本文链接:https://www.haomeiwen.com/subject/uwfqjxtx.html