zl程序教程

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

当前栏目

《Java程序员面试秘笈》—— 1.10 线程局部变量的使用

JAVA线程程序员面试 局部变量 秘笈 1.10 使用
2023-09-11 14:17:37 时间

本节书摘来异步社区《Java 7并发编程实战手册》一书中的第1章,第1.10节,作者:【西】Javier Fernández González,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.10 线程局部变量的使用

共享数据是并发程序最核心的问题之一,对于继承了Thread类或者实现了Runnable接口的对象来说尤其重要。

如果创建的对象是实现了Runnable接口的类的实例,用它作为传入参数创建多个线程对象并启动这些线程,那么所有的线程将共享相同的属性。也就是说,如果你在一个线程中改变了一个属性,所有线程都会被这个改变影响。

在某种情况下,这个对象的属性不需要被所有线程共享。Java并发API提供了一个干净的机制,即线程局部变量(Thread-Local Variable),其具有很好的性能。

本节中,我们将创建两个程序:第一个具有刚才提到的问题,另一个使用线程局部变量机制解决了这个问题。

准备工作
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。

范例实现
按照接下来的步骤实现本节的范例

1.使要实现的范例具有之前提到的共享问题。创建一个名为UnsafeTask的类,它实现了Runnable接口。声明一个私有的java.util.Date属性。

public class UnsafeTask implements Runnable{

 private Date startDate;```

2.实现run()方法,这个方法将初始化startDate属性,并且将值打印到控制台,让线程休眠一个随机时间,然后再次将startDate的值打印到控制台。

@Override
public void run() {
startDate=new Date();
System.out.printf("Starting Thread: %s : %sn",Thread. currentThread().getId(),startDate);
try {

TimeUnit.SECONDS.sleep( (int)Math.rint(Math.random()*10));

} catch (InterruptedException e) {

 e.printStackTrace();

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

}`
3.实现这个有问题的应用程序的主程序。创建一个包含main()方法的Main类。这个方法将创建一个UnsafeTask类对象,用它作为传入参数创建10个线程对象并启动这10个线程,每个线程的启动间隔2秒。

 public class Core {

 public static void main(String[] args) {

 UnsafeTask task=new UnsafeTask();

 for (int i=0; i i++){

 Thread thread=new Thread(task);

 thread.start();

 try {

 TimeUnit.SECONDS.sleep(2);

 } catch (InterruptedException e) {

 e.printStackTrace();

4.在下面的截屏中,你将看到这个程序执行的结果。每个线程有一个不同的开始时间,但是当它们结束时,三个线程都有相同的startDate属性值。

 div img src="https://yqfile.alicdn.com/99c4b18a096f0ba73d8b725a51b90efe41ab1aee.png" width="" height="" 

 /div 


public class SafeTask implements Runnable { 7.声明一个ThreadLocal对象。这个对象是在initialValue()方法中隐式实现的。这个方法将返回当前日期。

private static ThreadLocal startDate= new

ThreadLocal Date () {

 protected Date initialValue(){

 return new Date();

};```

8.实现run()方法。它跟UnsafeTask类的run()方法实现了一样的功能,但是访问startDate属性的方式改变了。

@Override

public void run() {

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

 try {

 TimeUnit.SECONDS.sleep((int)Math.rint(Math.random()*10));

 } catch (InterruptedException e) {

 e.printStackTrace();

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

 }```

9.这个范例的入口类与第一个范例一样,只是创建并作为参数参入的Runnable类对象不同而已。

10.运行范例,并分析两个范例之间的不同。

在下面的截屏中,你将看到安全线程类的执行结果。现在,这3个线程对象都有它们自己的startDate属性值。

线程局部变量分别为每个线程存储了各自的属性值,并提供给每个线程使用。你可以使用get()方法读取这个值,并用set()方法设置这个值。如果线程是第一次访问线程局部变量,线程局部变量可能还没有为它存储值,这个时候initialValue()方法就会被调用,并且返回当前的时间值。

 div img src="https://yqfile.alicdn.com/c0e418d3668796c2de1d761bbc5873ebbf84c340.png" width="" height="" 

 /div 

更多信息

差点跳起来了!全靠这份999页Java面试宝典,我刚拿到美团offer 事情是这样的,今年年初,在某个大博主那里拿到一份Java面试宝典,然后就一直躺在盘里吃灰,直到5月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套“积灰”的面试宝典拿出看了看,这一看就看了一个多月才算是完整的吃透。7月中旬开始面试美团了,前后差不多5面的样子,原本以为没啥希望,等到月底29号收到了offer,通知8月3号到公司报到,看到邮件那一刻差点跳起来了!
987页的Java面试宝典,看完才发现,应届生求职也没那么难 现在已经九月底,金九银十也已经过去了一大半,很明显今年的面试季明显不如往年火热,对于求职者来说,也更难了一些。马上迎来国庆节,假期一过,十月份又过去了三分之一,综合来看今年确实不是面试的最佳时期,不过趁今年所剩的时间来好好准备,明年的金三银四或许会顺利得多。不过,对于今年的应届生来说,等到明年再去面试,竞争就更大了。
全网首发“Java面试考点大全”,20+互联网公司,应有尽有 受疫情影响,今年似乎给人感觉时间比往年还要流逝得更快。显然,春节一过,我们又将迎来面试旺季金三银四。对于程序员来说,秋招的失利更意味着在金三银四要打一场“硬战”,可又有多少人做好了面试的准备呢?对于一线互联网公司的面试,你又了解多少呢?
系统梳理面试6大专题,阿里爆款Java面试速成笔记也太香了 每年的金三银四马上又要到了,相信有很多人都在准备面试了。我们都知道想要在金三银四面试跳槽肯定是要预先投简历的,不知道大家的简历投得怎么样了。反正我最近是收到很多粉丝的私信说自己投了简历却杳无音信,在第一关就败下阵来。(不瞒大家说这里楼主是有点幸灾乐祸的,哈哈)
进阶面试皆宜!阿里强推Java程序员进阶笔记,差距不止一点点 程序员要如何成长这个问题,一直是各大网站、论坛的热点。对此网络上众说纷纭,一千个读者里面就有一千个哈姆雷特。LZ觉得想要让个人技能成长速度,大于公司规模或业务的成长速度,不断优化自己,成为一名“不错”的程序员主要需要掌握以下学习方法与实战技巧。
硬核!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能 最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开Boss直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉Java一个初中级岗位有上千人同时竞争,内卷程度简直怀疑人生。
真香!阿里最新出品Java面试核心讲(终极版),Github已星标50K 程序员面试背八股,可以说是现在互联网开发岗招聘不可逆的形式了,其中最卷的当属Java!(网上动不动就是成千上百道的面试题总结)你要是都能啃下来,平时技术不是太差的话,面试基本上问题就不会太大。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。