博客
关于我
java线程之InheritableThreadLocal
阅读量:796 次
发布时间:2023-03-22

本文共 2676 字,大约阅读时间需要 8 分钟。

ThreadLocal和InheritableThreadLocal都是Java中用于管理线程本地变量的类,但它们在行为上有显著的区别。以下是对这两者区别的详细分析,并通过代码测试来验证。

ThreadLocal

ThreadLocal是一个用于在每个线程中保存特定变量的类。每个线程都有自己的独立副本,这意味着不同线程之间不会共享相同的值。这种机制非常有用,特别是在需要在多线程环境中避免状态共享时。

代码示例

import static java.lang.System.out;
import java.lang.Thread;
import java.util.concurrent.TimeUnit;
public class TestThreadLocal extends TestCase {
private void work(final ThreadLocal
local) {
local.set("a");
out.println(Thread.currentThread() + ",a");
}
public void testThreadLocal() throws InterruptedException {
final ThreadLocal
local = new ThreadLocal
();
work(local);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
work(local);
local.set("b");
out.println(Thread.currentThread() + ",b");
}
});
t.start();
t.join(TimeUnit.SECONDS, 1);
out.println(Thread.currentThread() + ",a");
}
}

输出结果

Thread[main,5,main],a
Thread[Thread-0,5,main],b
Thread[main,5,main],a

InheritableThreadLocal

InheritableThreadLocal与ThreadLocal类似,但它引入了继承的概念。创建一个InheritableThreadLocal变量后,它在子线程中可以被继承和修改,这意味着父线程和子线程共享相同的变量实例。

代码示例

import static java.lang.System.out;
import java.lang.Thread;
import java.util.concurrent.TimeUnit;
public class TestInheritableThreadLocal extends TestCase {
private void work(final InheritableThreadLocal
local) {
local.set("a");
out.println(Thread.currentThread() + ",a");
}
public void testInheritableThreadLocal() throws InterruptedException {
final InheritableThreadLocal
local = new InheritableThreadLocal
();
work(local);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
work(local);
local.set("b");
out.println(Thread.currentThread() + ",b");
}
});
t.start();
t.join(TimeUnit.SECONDS, 1);
out.println(Thread.currentThread() + ",a");
}
}

输出结果

Thread[main,5,main],a
Thread[Thread-0,5,main],a
Thread[Thread-0,5,main],b
Thread[main,5,main],a

区别分析

从输出结果可以看出:

  • ThreadLocal:

    • 在主线程中设置值为"a"。
    • 子线程在运行work(local)时,尝试设置值为"b"。
    • 子线程完成后,主线程再次输出值仍然是"a"。
    • 这意味着ThreadLocal的值在子线程中不会被继承或修改。
  • InheritableThreadLocal:

    • 在主线程中设置值为"a"。
    • 子线程在运行work(local)时,同样设置值为"b"。
    • 父线程的值也会被更新为"b",因为InheritableThreadLocal允许状态在子线程中进行修改,这种修改会被继承。
  • 总结

    • ThreadLocal:每个线程有自己的独立副本,不允许状态在子线程中被继承或修改。
    • InheritableThreadLocal:允许子线程修改并继承状态,这种状态修改会被父线程继承。

    因此,选择使用ThreadLocal还是InheritableThreadLocal,取决于是否需要线程之间的状态共享和继承。

    转载地址:http://ucqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现借记款项功能(附完整源码)
    查看>>
    Objective-C实现关系矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现内存映射文件(附完整源码)
    查看>>
    Objective-C实现内存泄露检查(附完整源码)
    查看>>
    Objective-C实现内格尔·施雷肯伯格算法(附完整源码)
    查看>>
    Objective-C实现分块查找算法(附完整源码)
    查看>>
    Objective-C实现分水岭算法(附完整源码)
    查看>>
    Objective-C实现分解质因数(附完整源码)
    查看>>
    Objective-C实现切换数字的符号switchSign算法(附完整源码)
    查看>>
    Objective-C实现列主元高斯消去法(附完整源码)
    查看>>
    Objective-C实现创建多级目录(附完整源码)
    查看>>
    Objective-C实现删除重复的字母字符算法(附完整源码)
    查看>>
    Objective-C实现判断32位的数字是否为正数isPositive算法(附完整源码)
    查看>>
    Objective-C实现十进制转N进制算法(附完整源码)
    查看>>
    Objective-C实现十进制转八进制算法(附完整源码)
    查看>>
    Objective-C实现华氏温度转摄氏温度(附完整源码)
    查看>>
    Objective-C实现单例模式(附完整源码)
    查看>>
    Objective-C实现单向链表的反转(附完整源码)
    查看>>
    Objective-C实现单向链表的反转(附完整源码)
    查看>>
    Objective-C实现单字母密码算法(附完整源码)
    查看>>