方法一:
将共享数据定义为静态类变量
适合全局共享数据的场景,即进程内所有线程可访问。
将数据对象定义为静态类变量,进程内的所有线程即可在数据对象允许的范围内实现访问数据对象。
方法二:
使用volatile关键字在线程之间共享数据
方法三:
使用InheritableThreadLocal
在多线程编程中,共享数据可能导致一系列的问题,如数据竞争和线程安全性问题。ThreadLocal(线程局部变量)是Java中一种解决多线程共享数据问题的机制。
ThreadLocal是Java中的一个类,用于提供线程本地变量。它允许你创建的变量只在访问它的线程中存在,不同线程间互不影响。每个线程都持有一个该变量的副本,而不是共享同一个实例。ThreadLocal
InheritableThreadLocal 的实现原理与 ThreadLocal 类似,都是通过在每个线程中维护一个映射(ThreadLocalMap)来实现的。但是,不同之处在于 InheritableThreadLocal 在创建子线程时,会将父线程的 InheritableThreadLocal 变量的值复制给子线程,以实现值的继承。
下面是线程初始化时会判断父线程的inheritableThreadLocals是否为空,如果不为空就将当前线程的inheritableThreadLocals设置为父线程的inheritableThreadLocals。
使用实例:
public class ThreadLocalDemo {public static void main(String[] args) {ThreadLocal threadLocal = new ThreadLocal();threadLocal.set("thread local");ThreadLocal threadLocal2 = new InheritableThreadLocal();threadLocal2.set("父子通信");Thread t = new Thread(() -> {System.out.println("好好学习" + threadLocal.get()+ threadLocal.toString());System.out.println("好好学习" +threadLocal2.get()+ threadLocal2.toString());});t.start();System.out.println(t.toString());}
}