Java多线程-ThreadLocal和InheritableThreadLocal的使用

ThreadLocal类

变量值的共享可以通过使用public static变量的形式。如果想每个线程都有自己的共享变量,可以通过JDK提供的ThreadLocal来实现。

类 ThreadLocal 主要解决的就是每个线程绑定自己的值,可以将 ThreadLocal 类比喻成全局存放数据的盒子,盒子中可以存放每个线程的私有变量。

示例:

public class Test {
    public static void main(String[] args) {
        try {
            for (int i = 0; i < 5; i++) {
                System.out.println("   在 Main 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                Thread.sleep(500);
            }
            Thread.sleep(2500);
            ThreadA a = new ThreadA();
            a.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class ThreadA extends Thread {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("在 ThreadA 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class ThreadLocalHolder {
        private ThreadLocalHolder() {
        }

        public static ThreadLocal getInstance() {
            return ThreadLocalHolder.Holder.INSTANCE;
        }

        private static class Holder {
            static final ThreadLocalHolder.MyThreadLocal INSTANCE = new ThreadLocalHolder.MyThreadLocal();
        }

        /**
         * 集成 ThreadLocal,给每个线程的共享变量一个初始值
         */
        private static class MyThreadLocal extends ThreadLocal {
            @Override
            protected Object initialValue() {
                return System.currentTimeMillis();
            }
        }
    }
}

运行结果如图:

类InheritableThreaddLocal 的使用

使用类 InheritableThreadLocal 可以在子线程中取得父线程继承下来的值。

示例:

public class Test {
    public static void main(String[] args) {
        try {
            for (int i = 0; i < 5; i++) {
                System.out.println("   在 Main 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                Thread.sleep(500);
            }
            Thread.sleep(2500);
            ThreadA a = new ThreadA();
            a.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class ThreadA extends Thread {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("在 ThreadA 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class ThreadLocalHolder {
        private ThreadLocalHolder() {
        }

        public static InheritableThreadLocal getInstance() {
            return ThreadLocalHolder.Holder.INSTANCE;
        }

        private static class Holder {
            static final ThreadLocalHolder.MyInheritableThreadLocal INSTANCE = new ThreadLocalHolder.MyInheritableThreadLocal();
        }

        /**
         * 集成 InheritableThreadLocal,给每个线程的共享变量一个初始值
         */
        private static class MyInheritableThreadLocal extends InheritableThreadLocal {
            @Override
            protected Object initialValue() {
                return System.currentTimeMillis();
            }
        }
    }
}

运行结果如下:

原文地址:https://www.cnblogs.com/lkc9/p/12560592.html

时间: 2024-08-05 22:36:06

Java多线程-ThreadLocal和InheritableThreadLocal的使用的相关文章

java 多线程-ThreadLocal

ThreadLocal:每个线程自身的存储本地.局部区域,类似于容器,每个线程都会在其中有一定存储空间常用的方法get/set/initialValue官方建议为private static每个线程存储自己的数据,更改不会影响其他线程ThreadLocal 子类InheritableThreadLocal:继承上下文环境的数据 public class my { //Integer 初始值为null //private static ThreadLocal<Integer> threadloc

跟我学Java多线程——ThreadLocal

ThreadLocal是什么 ThreadLocal这个词如果直接翻译就是"本地线程",可是如果真的按"本地线程"来理解,那就确实大错特错了,ThreadLocal它并不是一个Thread,它跟Thread确实有关系,是用来维护Thread的有关变量的,把它命名为ThreadLocalVariable可能更容易让人理解,在多线程中ThreadLocal为变量在每个线程中都创建了一个跟特定线程有关的变量的副本,这样就可以使每个线程在运行中只可以使用与自己线程有关的特定

Java多线程——ThreadLocal类

一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. 从线程的角度看,每个线程都保持一个对其线程局

java 多线程-ThreadLocal图

原文地址:https://blog.51cto.com/14437184/2430518

Java多线程与并发应用-(5)-如何优雅的使用ThreadLocal类

内容来自,张孝祥老师的张孝祥-Java多线程与并发库高级应用>视频教程 package com.lipeng; public class MyThreadLocalTest2 { private final static MyThreadLocal<String> myThreadLocal=new MyThreadLocal<String>(); /** * @param args */ public static void main(String[] args) { ne

java多线程模式ThreadLocal原理简述及其使用详解

原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解 代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm ThreadLocal是为了使每个线程保存一份属于自己的数据. 先看一个使用ThreadLocal的实例. package com.zuidaima.aop.framework; import com.zuidaima.core.NamedThreadLocal; public abstra

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Java之ThreadLocal原理分析

简介 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思.所以,在Java中编写线程局部变量

java concurrency: ThreadLocal及其实现机制

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1703382 ThreadLocal概念 从字面上来理解ThreadLocal,感觉就是相当于线程本地的.我们都知道,每个线程在jvm的虚拟机里都分配有自己独立的空间,线程之间对于本地的空间是相互隔离的.那么ThreadLocal就应该是该线程空间里本地可以访问的数据了.ThreadLocal变量高效地为每个使用它的线程提供单独的线程局部变量值的副本.每个线程只能看到与自己相联系的值,而不知道别的线程可