zl程序教程

您现在的位置是:首页 >  后端

当前栏目

线程管理(九)使用本地线程变量

线程变量 管理 本地 使用
2023-09-14 08:56:51 时间

并发应用的一个关键地方就是共享数据。这个对那些扩展Thread类或者实现Runnable接口的对象特别重要。

如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性。这意味着,如果你在一个线程里改变一个属性,全部的线程都会受到这个改变的影响。

有时,你希望程序里的各个线程的属性不会被共享。 Java 并发 API提供了一个很清楚的机制叫本地线程变量。

在这个指南中, 我们将开发一个程序,这个程序用来描述在第一段话里的问题,和另一个程序使用本地线程变量机制解决这个问题。

准备

指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢…

按照这些步骤来实现下面的例子:

1.   首先,我们来实现一个程序含有上述的问题。

创建一个类名为 UnsafeTask 并实现 Runnable 接口。 声明一个 private java.util.Date 属性.


2. 实现UnsafeTask 对象的run() 方法,此方法会初始 startDate 属性, 把值写入控制台,随机休眠一段时间,最后在写入startDate 属性。


System.out.printf("Starting Thread: %s : %s\n",Thread. currentThread().getId(),startDate);
System.out.printf("Thread Finished: %s : %s\n",Thread. currentThread().getId(),startDate);

3.   现在,来实现这个有问题例子的主类。创建一个 Main  类和 main() 方法. 此方法会创建一个 UnsafeTask 类的对象,并开始3个线程使用这个对象,每个线程间休眠2秒。


4.   在以下的裁图,你可以发现这个程序的执行结果。每个线程有着不同的开始时间,但是全部都有相同的结束时间。

5.   如在之前提到的, 我们会使用本地线程变量机制来解决这个问题。

6.   创建一个类名为 SafeTask a一定实现 Runnable 接口。


7.   声明 ThreadLocal Date 类对象。此对象有隐含实现了 initialValue()方法. 此方法会返回真实日期。


8.   实现run()方法。它和 UnsafeClass的run() 方法功能一样,只是改变了属性的访问方式。


  System.out.printf("Starting Thread: %s : %s\n",Thread.currentThread().getId(),startDate.get());
System.out.printf("Thread Finished: %s : %s\n",Thread.currentThread().getId(),startDate.get());

9.    这个例子的主类跟不安全例子一样,把名字改成 Runnable 类。

10. 运行例子并分析不同处。

它是怎么工作的…

在下面的截图里,你可以看到线程安全模式下程序运行的结果。现在3个 Thread 对象都有他们自己的startDate 属性值。看下图:

本地线程变量为每个使用这些变量的线程储存属性值。可以用 get() 方法读取值和使用 set() 方法改变值。 如果第一次你访问本地线程变量的值,如果没有值给当前的线程对象,那么本地线程变量会调用 initialValue() 方法来设置值给线程并返回初始值。

更多…

本地线程类还提供 remove() 方法,删除存储在线程本地变量里的值。

Java 并发 API 包括 InheritableThreadLocal 类提供线程创建线程的值的遗传性 。如果线程A有一个本地线程变量,然后它创建了另一个线程B,那么线程B将有与A相同的本地线程变量值。 你可以覆盖 childValue() 方法来初始子线程的本地线程变量的值。 它接收父线程的本地线程变量作为参数。 


进程和线程的区别 线程是cpu调度的最小单位。一个进程可以有多个线程,各个线程共享进程的内存空间、系统资源,进程是操作系统资源分配的最小单位。
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系? 进程,直观点说,保存在硬盘上的程序运行之后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。