Java TheadLocal简介说明
下文笔者将讲述Java TheadLocal的相关简介及使用说明,如下所示:
每个线程都需要实例化一次
下文将讲述将ThreadLocal对象设置的值对所有线程可见的方法分享
InheritableThreadLocal允许一个线程创建的所有子线程访问其父线程的值
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允许一个线程创建的所有子线程访问其父线程的值
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


