本文共 2676 字,大约阅读时间需要 8 分钟。
ThreadLocal和InheritableThreadLocal都是Java中用于管理线程本地变量的类,但它们在行为上有显著的区别。以下是对这两者区别的详细分析,并通过代码测试来验证。
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],aThread[Thread-0,5,main],bThread[main,5,main],a
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],aThread[Thread-0,5,main],aThread[Thread-0,5,main],bThread[main,5,main],a
从输出结果可以看出:
ThreadLocal:
work(local)时,尝试设置值为"b"。InheritableThreadLocal:
work(local)时,同样设置值为"b"。因此,选择使用ThreadLocal还是InheritableThreadLocal,取决于是否需要线程之间的状态共享和继承。
转载地址:http://ucqfk.baihongyu.com/