首页 > 其他分享 >第十四章《多线程》第9节:ThreadLocal类

第十四章《多线程》第9节:ThreadLocal类

时间:2022-12-17 10:04:35浏览次数:49  
标签:account Account maxValue ThreadLocal 线程 第十四章 多线程 属性


如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但有些情况下,需要让一个对象的属性对于不同的线程具有不同的值,也就是说,a对象的x属性的值在一个线程那里是1,在另一个线程那里是2。

使用ThreadLocal类就能实现这样需求。如果对象的属性类型是Integer,那么可以在定义类时定义一个ThreadLocal类的对象,并且以指定ThreadLocal的类型参数为Integer,例如:

class A{
ThreadLocal<Integer> x = new ThreadLocal<Integer>();
}

以上代码中x属性就是一个ThreadLocal类对象,它的内部包装了一个Integer类对象,如果多个线程共享A类对象a,那么这个Integer的值可以在不同的线程中被指定为不同的值。这个ThreadLocal类定义的属性很有用处,例如有一个Account类表示账户,一个企业中,总经理能够一次性动用账户中一百万元,而副总经理只能一次性动用账户中的五十万元,那么Account中能够被动用的最大金额就可以用ThreadLocal类来定义,下面的【例14_20】就展示了ThreadLocal类的使用方法。

【例14_20 ThreadLocal类】

Exam14_20.java

class Account{
//能够动用的最大账户金额
ThreadLocal<Integer> maxValue = new ThreadLocal<Integer>();
Account(Integer maxValue){
this.maxValue.set(maxValue);
}
synchronized void printMaxValue(){
System.out.print(Thread.currentThread().getName());
System.out.println("能够动用的最大金额:"+maxValue.get());
}
}
class AccountThread extends Thread{
Account account;
Integer ownValue;//自身能动用的最大账户金额
AccountThread(String name,Account account,Integer ownValue){
super(name);
this.account = account;
this.ownValue = ownValue;
}
@Override
public void run() {
account.maxValue.set(ownValue);//①
account.printMaxValue();
}
}
public class Exam14_20 {
public static void main(String[] args) {
Account account = new Account(60000);
System.out.println("主线程中a对象的maxValue值:"+account.maxValue.get());
new AccountThread("总经理",account, 1000000).start();
new AccountThread("副总经理",account,500000).start();
}
}

【例14_20】中,Account类表示账户,账户最大可动用金额由maxValue属性来表示。可以看出:maxValue属性的类型是ThreadLocal,这个ThreadLocal类对象中包装了一个Integer对象,这个对象才是真正可动用的最大账户金额。main()方法中创建了一个Account类的对象account,并设置其maxValue属性的值为60000。以account为构造方法创建出的两个线程分别表示总经理和副总经理。这两个线程开始运行后首先设置自身可动用的最大金额为1000000和500000,之后再打印自身可动用金额的数值。【例14_20】的运行结果如图14-19所示。

第十四章《多线程》第9节:ThreadLocal类_Java

图14-19【例14_20】运行结果

从图14-19可以看出:每个线程中account的maxValue值各不相同。之所以能够做到同一个对象的相同属性具有不同的值,这是因为ThreadLocal类的属性在内存中为每个线程中都创建了副本,其中主线程也是一个线程,因此这个maxValue属性具有三个副本,分别属于主线程、总经理和副总经理。特别需要强调:只有在线程开始运行后,ThreadLocal类的属性才会被创建副本,因此语句①是在run()方法中设置每个线程的maxValue值而不是在Account构造方法中进行设置。如果程序员在构造方法中进行设置,那么不会出现maxValue的三个副本。

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

标签:account,Account,maxValue,ThreadLocal,线程,第十四章,多线程,属性
From: https://blog.51cto.com/u_2266836/5949448

相关文章

  • 第十四章《多线程》第7节:线程组
    多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个......
  • 第十四章《多线程》第6节:线程通信
    之前所有的例子中,线程的执行都具有一定的随机性。如果希望线程能够有序的执行,必须使用线程通信技术。Java语言提供了一些线程通信的机制能够保证线程的有序执行,本小节将详细......
  • 第十四章《多线程》第4节:控制线程
    从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期望......
  • Servlet多线程
    Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类......
  • Java多线程详解(通俗易懂)
    一、线程简介1.什么是进程?电脑中会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。例如图中的微信、酷狗音乐、电脑管家等等。2.什么是......
  • Java并发多线程高频面试题
    并发知识不管在学习、面试还是工作过程中都非常非常重要,看完本文,相信绝对能助你一臂之力。1、线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程。每个进程都有......
  • 多线程有哪几种创建方式
    1、继承Thread创建线程继承java.lang.Thread类,重写run()方法,在run()方法中实现运行在线程上的代码,调用start()方法开启线程本质上是实现了Runnable接口的一......
  • Java 多线程编程
      ava给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的......
  • 多线程
    run和start区别​​https://zhidao.baidu.com/question/1496082367158609459.html​​ThreadLocal​​https://www.zhihu.com/question/23089780​​​......
  • JAVA中生成随机数Random VS ThreadLocalRandom性能比较
    前言大家项目中如果有生成随机数的需求,我想大多都会选择使用Random来实现,它内部使用了CAS来实现。实际上,JDK1.7之后,提供了另外一个生成随机数的类ThreadLocalRandom,那么......