每日速记10道java面试题08

其他资料

每日速记10道java面试题01-CSDN博客

每日速记10道java面试题02-CSDN博客

每日速记10道java面试题03-CSDN博客

每日速记10道java面试题04-CSDN博客

每日速记10道java面试题05-CSDN博客

每日速记10道java面试题06-CSDN博客

每日速记10道java面试题07-CSDN博客

目录

 

1.什么是java内存模型?

2.什么是java的原子性、可见性、有序性?

3.Java 中的 final 关键字是否能保证变量的可见性?

4.为什么在 Java 中需要使用 ThreadLocal?

5.Java 中的 ThreadLocal 是如何实现线程资源隔离的?

6.为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?

7.既然说了那么多ThreadLocal,那TheadLocal有什么缺点呢?

8.如何将当前线程的局部变量传递到另一个线程?

9.Java中Thread.sleep 和 Thread.yield 的区别?

10.Java 中 Thread.sleep(0)的作用是什么?


 

1.什么是java内存模型?

1.JMM内存模型是java虚拟机定义的一种规范,是为了消除早期不同硬件和操作系统访问内存时的差异。
2.JMM内存模型规范了内存中的变量存储和传递的规则。即线程何时从主内存中读取数据,何时把工作内存中数据写回主内存。
3.保证了多线程环境下的可见性、原子性、有序性。
可见性:即一个线程对变量的修改对其他线程来说是可见的,可以通过volatile关键字实现。
原子性:线程的操作是一个不可分割的一系列操作,不能被中断,分割,要么全部失败要么全部成功。
有序性:线程的执行是有一定顺序的,JMM允许通过指令重排序来提高性能,指令重排序会保证线程内的操作顺序不会被破坏,不会影响线程执行最终的结果,并通过happens-before规则来保证其有序性。

2.什么是java的原子性、可见性、有序性?

1)原子性(Atomicity)
原子性指的是一个操作或一系列操作要么全部执行成功,要么全部不执行,期间不会被其他线程干扰。

原子类与锁:Java 提供了 java.util.concurrent.atomic包中的原子类,如 AtomicInteger,Atomiclong ,来保证基本类型的操作具有原子性。此外,synchronized 关键字和 Lock 接口也可以用来确保操作的原子性。
CAS(Compare-And-Swap):Java 的原子类底层依赖于 CAS 操作来实现原子性。CAS 是一种硬件级的指令,它比较内存位置的当前值与给定的旧值,如果相等则将内存位置更新为新值,这一过程是原子的。CAS 可以避免传统锁机制带来的上下文切换开销。

2)可见性(Visibility)
可见性指的是当一个线程修改了某个共享变量的值,其他线程能够立即看到这个修改。

volatile: volatile关键字是Java 中用来保证可见性的轻量级同步机制。当一个变量被声明为 volatile时,所有对该变量的读写操作都会直接从主内存中进行,从而确保变量对所有线程的可见性。synchronized:synchronized 关键字不仅可以保证代码块的原子性,还可以保证进入和退出 synchronized 块的线程能够看到块内变量的最新值。每次线程退出 synchronized 块时,都会将修改后的变量值刷新到主内存中,进入该块的线程则会从主内存中读取最新的
Java Memory Model(JMM):JMM 规定了共享变量在不同线程间的可见性和有序性规则。它定义了内存屏障的插入规则,确保在多线程环境下的代码执行顺序和内存可见性。

3)有序性(Ordering)
有序性指的是程序执行的顺序和代码的先后顺序一致。但在多线程环境下,为了优化性能,编译器和处理器可能会对指令进行重排序。

指令重排序:为了提高性能,处理器和编译器可能会对指令进行重排序。尽管重排序不会影响单线程中的执行结果,但在多线程环境下口能会导致严重的问题。例如,经典的双重检查锁定(DCL)模式在没有正确同步的情况下,由于指令重排序可能导致对象尚未完全初始化就被另一个线程访问。

3.Java 中的 final 关键字是否能保证变量的可见性?

final关键字的作用主要是用于声明常量和防止重写,它与变量的可见性有关,但不是直接保证可见性。当一个对象的final字段被初始化后,其他线程可以安全地访问这个字段,前提是对象的构造完成后被共享。JMM规定,一旦构造函数完成,final字段的值对其他线程是可见的。 

4.为什么在 Java 中需要使用 ThreadLocal?

 因为在多线程编程中,多个线程可能会同时访问和修改共享变量,导致线程安全问题。 ThreadLocal 提供了一种简单的解决方案,使每个线程都有自己的独立变量副本,避免了多线程间的变量共享和竞争,从而解决了线程安全问题。与通过加锁、同步块等传统方式来保证线程安全相比。 Threadlocal不需要对变量访问进行同步,减少了上下文切换、锁竞争的性能损耗。

以上是某面试网站的答案,但我认为ThreadLocal最主要的作用是方便每个线程处理自己的状态而引入的一种机制,比如当前登录用户的id,如果没有ThreadLocal,我们每次要用都只能在发过来的请求中提取,特别的麻烦。TheadLocal确实有解决共享变量的作用,但我们一般不会专门用TheadLocal来解决共享变量,一般会加锁来解决这个问题。

5.Java 中的 ThreadLocal 是如何实现线程资源隔离的?

每一个线程都有自己的ThreadLocalMap,设置值是设置到自己的map里面取的话也是从自己的map里面取,从而实现了线程隔离。


ThreadLocal原理:
ThreadLocalMap里面有个Entry数组,Entry的key是ThreadLocal对象,key是通过弱引用指向ThreadLocal对象的value是设置的值。
get方法:get方法会先获取当前线程,然后得到当前线程的ThreadLocalMap,然后将当前的ThreadLocal对象作为key从map里面拿到Entry,如果找到的话,直接返回这个entry中的value;没有找到的话,就会调用初始化方法,返回初始值。

6.为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?

垃圾回收:弱引用允许垃圾回收器(GC)在没有强引用指向这些对象时回收它们。如果 ThreadLocal 对象没有被外部强引用,那么将其设置为弱引用可以确保垃圾回收器能够回收这些对象,即使它们仍然被某些线程的 ThreadLocalMap 引用。

内存泄漏问题:如果 ThreadLocalMap 的 key 是强引用,当线程结束时,由于线程对象还持有对 ThreadLocal 实例的强引用,这时候ThreadLocal对象不能被GC(垃圾回收器)视为“垃圾”,因此无法被正确回收,导致 ThreadLocalMap 中 的entry 无法及时被清理,从而造成内存泄漏;

弱引用解决方案:将 ThreadLocalMap中 的 key 设为 弱引用可以有效避免这个问题,因为 弱引用 的对象在下一次垃圾回收时就会被回收,这样一来,即使线程结束后,ThreadLcoal 对象也能够被正确的回收,从而避免内存泄漏;

延伸→这里可能会被提问到JVM的垃圾回收机制。

7.既然说了那么多ThreadLocal,那TheadLocal有什么缺点呢?

1.内存泄漏风险 ThreadLocal变量会在整个线程生命周期内存在,除非明确地被设置为null或者线程结束。如果线程长时间运行而没有适当地清理 ThreadLocal 变量,那么这些变量会一直占据内存,从而导致内存泄漏。
2.不适合共享数据 ThreadLocal的设计初衷是为了每个线程提供独立的数据副本,因此不适合用来在多个线程之间共享数据。如果需要多个线程共享数据,应该考虑使用其他同步机制,如synchronized、Lock 或 Atomic 类型。
3.难以调试 由于 ThreadLocal 变量是线程私有的,因此在调试时很难追踪每个线程的状态。如果多个线程在操作 ThreadLocal 变量时出现问题,调试起来可能会比较困难。
4.静态 ThreadLocal 变量的问题 如果 ThreadLocal 变量是静态的,那么这个变量会伴随整个应用程序的生命周期,除非显式地调用 remove() 方法。这意味着即使线程结束了,ThreadLocal 变量仍然存在,可能会导致内存泄漏。
5.性能开销 虽然 ThreadLocal 可以减少锁的竞争,但是它也有一定的性能开销。每次访问 ThreadLocal 变量时都需要查找线程的本地存储空间,这比直接访问普通变量要慢一些。

8.如何将当前线程的局部变量传递到另一个线程?

我们可以使用阿里开源的一个组件:TransmittableThreadLocal(TTL),TransmittableThreadLocal是一种扩展了Java 的 ThreadLocal 的功能的类,主要解决在多线程环境中,特别是在线程池中,如何将线程局部变量从一个线程传递到另一个线程的问题特性:
1.允许在任务从一个线程(例如,一个线程池中的线程)转移到另一个线程时,保持线程局部变量的值
2.TransmittableThreadLocal 能够捕获当前线程的局部变量并在新线程中恢复这些变量,支持异步执行
3.TransmittableThreadLocal 提供了对当前线程的值进行快照的能力,并在新的线程中恢复这些值适用场景:
1.使用 TransmittableThreadLocal 能确保ThreadLocal在执行过程中能够传递所需的上下文信息
2.在进行异步处理或回调时,TransmittableThreadLocal 确保在异步执行上下文中,可以访问到原线程的上下文信息

9.Java中Thread.sleep 和 Thread.yield 的区别?

暂停时间Thread.sleep 可以让线程暂停一段确定的时间,而 Thread.yield 不会暂停线程,只是建议调度器让出CPU。

响应中断Thread.sleep 可以响应中断,而 Thread.yield 不会抛出异常,也不会改变线程的中断状态。

锁的管理:两者都不会导致线程释放锁。

调度行为Thread.sleep 会导致线程进入TIMED_WAITING状态,而 Thread.yield 只是向调度器发出一个调度建议,不会改变线程的状态。

10.Java 中 Thread.sleep(0)的作用是什么?

  1. 提示线程调度器Thread.sleep(0) 可以被看作是一种提示,告诉线程调度器当前线程愿意让出CPU给其他同优先级的线程。尽管这个调用不会使线程实际休眠,但它会触发线程调度器重新考虑线程的调度。

  2. 释放CPU:如果当前线程是运行状态,并且执行了Thread.sleep(0),它会释放CPU给其他线程,即使没有其他同优先级的线程可以运行,当前线程也可能在下一次调度时被延迟执行。

  3. 响应中断:尽管Thread.sleep(0)不会使线程进入长时间的休眠状态,但如果在调用Thread.sleep(0)之前线程的中断状态已经被设置,那么这个方法会抛出InterruptedException,并且清除中断状态。这可以作为一种快速响应中断的方式

延伸→那这个作用不是和Thread.yield一样吗?这两者有什么区别呢?

两者都不会进入阻塞状态且愿意让出CPU给其他线程,但是:

Thread.sleep(0) 会检查线程的中断状态。如果线程在调用之前被中断,Thread.sleep(0) 会抛出InterruptedException,并且清除中断状态。

Thread.yield 不会抛出异常,也不会改变线程的中断状态,它只是单纯地提示线程调度器当前线程愿意让出CPU。

延伸→这两者的应用场景分别在哪些方面呢?

Thread.sleep(0)可以在循环中使用 ,提供一个快速检查线程中断状态的机会,尤其是在需要频繁响应中断信号的场合。

在实时性要求不高的场景下,Thread.yield() 可以用来让当前线程偶尔让出CPU,给其他线程执行的机会。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/482994.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web day07 项目实战

目录 Restful风格: 代码结构: 1). Controller层 2). Service层 3). Mapper(dao)层 4).yml文件: 数据封装: 1). 手动结果映射 2). 起别名 3). 开启驼峰命名(推荐) 删除部门: 新增部门&a…

rest-assured multiPart上传中文名称文件,文件名乱码

rest-assured是一个基于java语言的REST API测试框架,在使用rest-assured的multipart 上传文件后,后端获取的文件名称乱码。截图如下: 原因是rest-assured multipart/form-data默认的编码格式是US-ASCII,需要设置为UTF-8。 Befo…

【Git操作】-- 将已存在的项目复制一份到另一个分组空间下

目录 1、需求描述 2、操作步骤 2.1 配置 2.2、git 上创建新项目 2.3 添加到旧的项目中 2.3、将新项目添加到待复制的项目上 3、Push an existing Git repository 4、浏览器打开新项目 nn_bigdata 5、其他:如果项目已经拉取到本地,那么可以使用以…

搭建环境-PHP简介及环境搭建教程

搭建环境-PHP简介及环境搭建教程 前言 在现代Web开发中,PHP是一种广泛使用的服务器端脚本语言,它以简洁、高效和跨平台的特性受到开发者的青睐。无论是小型网站还是大型企业应用,PHP都能提供强大的支持。本文将为您详细介绍PHP的基本概念、特点,以及如何搭建PHP开发环境。…

Python中通过点运算符来访问命名空间中参数args方法

Python中通过点运算符来访问命名空间中参数args方法 在Python中,在使用args进行参数传入时,通常是调用argparse模块的ArgumentParser来创建对象。这种设计虽然使得访问命令行参数更加方便,可以通过点运算符来访问命名空间中的参数。但是当封装…

Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了音频的大小设置与保存加载 音频管理器 UI_VolumeSlider.cs 定义了 UI_VolumeSlider 类,用于处理与音频设置相关的…

基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统

所有仿真详情导航: PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DS1302时钟模块,通过LCD1602显示实时时间,也可以储存时间在AT2DC02中&#xff0c…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错:Creating Server TCP listening socket *:6379: bind: No error 解决方案: 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown,关闭 3、输exit,退出 4、重新输入 redis-server.exe redis.windows.conf&…

【HM-React】02. React基础-下

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 function App(){const [value, setValue] useState()return (<input type"text" value{value} onChange{e > setValue(e.target.value)}/>) …

基于python的汽车数据爬取数据分析与可视化

一、研究背景 基于提供的代码片段和讨论&#xff0c;我们可以得出一个与网络抓取、数据处理和数据可视化相关的研究背景&#xff0c;该背景涉及到汽车行业。以下是研究背景的陈述&#xff1a; "在迅速发展的汽车行业中&#xff0c;准确和及时的数据对各方利益相关者至关…

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计…

使用 Monaco Editor 实现 ECharts 变量使用功能

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever&#xff08;均为Hinton的学生&#xff09;和Geoffrey Hinton&#xff08;被誉为”人工智能教父“&#xff0c;首先将反向传播用于多层神经网络&#xff09;在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…

网络安全(三):网路安全协议

网络安全协议设计的要求是实现协议过程中的认证性、机密性与不可否认性。网络安全协议涉及网络层、传输层与应用层。 1、网络层安全与IPSec协议、IPSec VPN 1.1、IPSec安全体系结构 IP协议本质上是不安全的额&#xff0c;伪造一个IP分组、篡改IP分组的内容、窥探传输中的IP分…

AWS账号提额

Lightsail提额 控制台右上角&#xff0c;用户名点开&#xff0c;选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…

LCD与lvgl

LCD与lvgl 目录 LCD与lvgl 回顾 LCD 的驱动层讲解 1、LCD 的常见接口 2、我们的 LCD 的参数 3、LCD 的设备树说明 4、LCD 的设备树说明 5、如何移植 LCD 的驱动(重点) LCD 的应用层开发 1&#xff1a;LCD 应用开发->界面开发的方法 2&#xff1a;LVGL 模拟器安装…

Linux -初识 与基础指令2

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【Linux】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4da; 前言&#x1f511; 概念一&#x1f511; 概念二 &#x1f4d6; man&#x1f4ac; echo&#x1f4c1; cp&#x1f4c2; mv&#x1f511; 概念三&am…

HCIE IGP双栈综合实验

实验拓扑 实验需求及解法 本实验模拟ISP网络结构&#xff0c;R1/2组成国家骨干网&#xff0c;R3/4组成省级网络&#xff0c;R5/6/7组成数据中 心网络。 配置所有ipv4地址&#xff0c;请自行测试直连。 R1 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.…

大模型微调论文阅读 LoRA:LOW-RANK ADAPTION OF LARGE LANGUAGE MODELS 大型语言模型的低秩自适应

论文link&#xff1a;https://arxiv.org/pdf/2106.09685 code&#xff1a;https://github.com/microsoft/LoRA LoRA&#xff1a;Low-Rank Adaptation of Large Language Models Abstract 自然语言处理的一个重要范例是对通用领域数据进行大规模预训练&#xff0c;并适应特定任…