Java TheadLocal简介说明

java-教程王 Java教程 发布时间:2021-10-18 10:16:02 阅读数:14882 1
下文笔者将讲述Java TheadLocal的相关简介及使用说明,如下所示:

TheadLocal简介

Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作
尽管有两个线程同时执行一段相同的代码
如果这段代码又有一个指向同一个ThreadLocal变量的引用,此时这两个线程依然不能看到彼此的ThreadLocal变量域
-----------------------------------------------
ThreadLocal的作用:提供线程内的局部变量(数据隔离),
在多线程环境下,可保证每一个变量的独立

创建一个ThreadLocal对象

private ThreadLocal myThreadLocal = new ThreadLocal();
以上代码实例化一个ThreadLocal对象
每个线程都需要实例化一次
在以上的代码中,每个线程都只能看见自身的myThreadLocal对象值

访问ThreadLocal对象

当创建完ThreadLocal对象后,我们可以使用以下方式来存储此对象的值,如:
myThreadLocal.set("设置值");

//读取值
String threadLocalValue = (String) myThreadLocal.get();
/*
get()方法会返回一个Object对象
set()方法则依赖一个Object对象参数
*/

ThreadLocal泛型

我们可以通过创建一个泛型的ThreadLocal对象的方式,避免每次进行数据转换,如下所示:
private ThreadLocal myThreadLocal1 = new ThreadLocal<String>();
myThreadLocal1.set("字符串");
String threadLocalValues = myThreadLocal.get();

初始化ThreadLocal

由于ThreadLocal对象的set()方法设置的值只对当前线程可见
下文将讲述将ThreadLocal对象设置的值对所有线程可见的方法分享
使用ThreadLocal子类的实现,并覆写initialValue()方法,就可以为ThreadLocal对象指定一个初始化值
如下
private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
   @Override 
   protected String initialValue() {
       return "初始化值";
   }
};
运用以上设置后,
在set()方法调用前,
调用get()方法,所有线程都可以看到同一个初始化值

ThreadLocal完整示例

public class ThreadLocalExample {
    public static class MyRunnable implements Runnable {
        private ThreadLocal<Integer> threadLocal =
               new ThreadLocal<Integer>();
        @Override
        public void run() {
            threadLocal.set( (int) (Math.random() * 100D) );
 
            try {
                Thread.sleep(2000);
                } catch (InterruptedException e) {
                }
            System.out.println(threadLocal.get());
        }
    }

    public static void main(String[] args) {
        MyRunnable sharedRunnableInstance = new MyRunnable();
        Thread thread1 = new Thread(sharedRunnableInstance);
        Thread thread2 = new Thread(sharedRunnableInstance);

        thread1.start();
        thread2.start();

        thread1.join(); //wait for thread 1 to terminate
        thread2.join(); //wait for thread 2 to terminate
    }
}

/*
以上两个线程共享一个MyRunnable
当线程运行时,都会为ThreadLocal实例设置不同的值
当调用set()方法的时候
由于是ThreadLocal对象,所以两个线程无法看到彼此的值
因此可设置和获取不同的值
*/

InheritableThreadLocal

InheritableThreadLocal类是ThreadLocal的子类
InheritableThreadLocal允许一个线程创建的所有子线程访问其父线程的值
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202110/1485.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者