面试多线程八股文五问五答第四期

面试多线程八股文五问五答第四期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!

⭐点赞⭐收藏⭐不迷路!⭐

1)Java 如何实现多线程之间的通讯和协作?

  • 使用共享变量:多个线程共享一个变量,通过对变量的读写操作来进行通讯和协作。
  • 使用 wait()、notify()和notifyAll()方法:线程可以通过调用wait()方法来等待某个条件的满足,其他线程可以通过notify()或notifyAll()方法来通知等待的线程条件已经满足。
  • 使用 Lock 和 Condition:通过Lock和Condition接口可以实现更灵活的线程通讯和协作,可以精确地控制线程的等待和唤醒。

2)Thread 类中的 yield 方法有什么作用?

Thread类中的yield方法的作用是让出当前线程的CPU执行时间,给其他具有相同优先级的线程执行的机会。调用yield方法会使当前线程从运行状态转为就绪状态,然后调度器会从就绪状态的线程中选择一个执行。

3)为什么说 Synchronized 是非公平锁?

Synchronized是非公平锁的原因是因为它不保证线程获取锁的顺序与它们发出请求的顺序完全一致。当多个线程同时竞争一个锁时,Synchronized会选择任意一个线程来获取锁,而不是按照线程的请求顺序来选择。

4)请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?

  • 保证可见性:当一个线程修改了volatile修饰的变量的值,其他线程可以立即看到最新的值。
  • 不保证原子性:volatile修饰的变量只能保证可见性,不能保证原子性,即不保证多个线程同时对变量进行读写的操作是原子性的。
  • 不能保证有序性:volatile修饰的变量只能保证可见性,不能保证指令的执行顺序。

volatile可以保证变量对所有线程的可见性是因为它使用了内存屏障(Memory Barrier)的机制。当一个线程修改了volatile修饰的变量的值时,会立即将该值刷新到主内存中,其他线程在读取该变量时会先从主内存中获取最新的值,确保了所有线程对变量的操作都是基于最新的值。

5)为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?

Synchronized是一个悲观锁的原因是它假设在多线程环境下会发生竞争,因此默认情况下会阻塞其他线程的访问,以保证数据的一致性。Synchronized使用了互斥锁的机制,线程在访问同步代码块之前需要先获取锁,其他线程在获取不到锁的情况下会被阻塞。

乐观锁的实现原理是基于版本号或时间戳的机制。在乐观锁中,每个线程在修改数据之前会先获取数据的版本号或时间戳,然后在写入数据时会比较版本号或时间戳是否发生了变化,如果没有变化则说明数据没有被其他线程修改过,可以进行写入操作;如果发生了变化则说明数据已经被其他线程修改过,当前线程需要重新获取最新的数据并重新进行操作。乐观锁通过避免线程阻塞和等待来提高并发性能,但是需要对数据的一致性进行额外的控制。

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

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

相关文章

一文读懂Solana 上最正统的铭文通证$mash

早在 2023 年的 11 月,包括 Solana、Avalanche、Polygon、Arbitrum、zkSync 等生态正在承接比特币铭文生态外溢的价值。当然,因铭文赛道过于火爆,当 Avalanche、BNB Chain 以及 Polygon 等链上 Gas 飙升至极值,Arbitrum、zkSync 等…

C++学习(二)

我们是在学习过了C语言,基础上来看这篇文章的,如果你是直接学C,这篇文章不太适合你的,因为这里只讲C基础中与C语言不同之处。 一.main函数区别 在C语言中,我们写main函数是不是可以省略前面的int,但是在C中&#xff…

深度学习|5.2 偏差和方差

偏差和方差 Bias(偏差):偏差是指对样本点的估计值和实际值的偏离程度。偏差越大,样本点越不符合实际值。偏差衡量单个数据点的偏离程度,如下图的第二行。 Variance(方差):方差能代表…

希尔排序算法——交换法

希尔排序,又称缩小增量排序,是插入排序的改进版。它是因DL.Shell于1959年提出而得名。希尔排序的实质就是分组插入排序,该方法是非稳定的排序算法。 具体来说,希尔排序通过将待排序序列分成多个子序列,分别…

罗技k380连不上蓝牙?

我一直以为是键盘锁住了,或者我按一些键 什么的可以解决,但是都没用。 解决方案:由于我把键盘放在了金属表面 ,导致蓝牙失灵。 在官网上找到的解决方案,连接放在这里,里面还提到了不能在一些特殊的地方操…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、​​​​​​​使用示例

CMake入门教程【核心篇】引用子模块.cmake文件(include)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 include子模块举个例…

C#编程-使用构造函数和析构函数

使用构造函数和析构函数 如果想要在以创建对象时就初始化成员变量,可以创建名为构造函数的特殊函数。您可能还需要使用对象后从内存中删除这些对象。这可通过称为析构函数的函数实现。 实现构造函数 构造函数是在创建对象时自动调用的特殊方法。无须显式地调用构造函数。请…

使用MQTT.JS创建一个网页版的MQTT客户端

一、MQTT.JS介绍 MQTT.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库。可以用于微信小程序、支付宝小程序等定制浏览器环境。 我们可以直接在HTML文件中进行调用…

CMake是什么?为什么学习CMake

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.CMake简介2.为什么…

RK3566 ANDROID 11 平台上适配移远EC200A

适配前理清楚一下调试的流程: 1.该模块为LGA封装,需要控制上电时序模块才能正常上电工作: 2.模块供电正常后,读取模组的PID 和VID 并将其ID添加到内核里面,确保USB转Serial端口能够正常生成: 3.生成ttyUSB0~ttyUSB2…

【报错解决】TypeError: __init__() got an unexpected keyword argument ‘size‘

报错描述 我在使用Doc2vec训练模型时,遇到了这一报错,相应的代码及报错信息如下所示: #代码model Doc2Vec(x_train, min_count5, window5, sizesize, sample1e-4, negative5,workersmultiprocessing.cpu_count())#报错信息TypeError: __in…

Redis(二)

1、redis的持久化 "Redis 如何将数据写入磁盘",首先要明白的时候,我们使用的redis的数据保存在内存上的,也就是说,只要我们的电脑关机或者重启服务器,那么在内存中的数据就会消失,所以要想持久化…

06.02 customizing plots with style sheets

使用 style 来配置 pyplot 风格 import matplotlib.pyplot as plt import numpy as np%matplotlib inlinestyle 是 pyplot 的一个子模块,方便进行风格转换, pyplot 有很多的预设风格,可以使用 plt.style.available 来查看: plt.…

浅谈命令模式

命令模式是一种行为设计模式,用于将一个请求封装成一个对象,从而使得请求的发送者和接收者解耦,并支持对请求进行参数化、队列化、撤销和重做等操作。 在命令模式中,有一下介个关键角色: Command(命令&am…

ubuntu 卸载桌面

要卸载Ubuntu上的桌面环境,您可以按照以下步骤进行操作: 登录到您的Ubuntu系统,并打开终端。 确认您当前正在使用的桌面环境。可以运行以下命令来查看已安装的桌面环境: s /usr/share/xsessions/ 根据您当前使用的桌面环境&…

爆肝整理,接口性能测试总结,一篇直接上高速...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、 性能测试术语…

初级前端算法

题目1 题目描述&#xff1a; 找出数组中的最大值 输入&#xff1a; [3, 9, 2, 5, 1] 输出&#xff1a; 9 JavaScript解答&#xff1a; function findMaxValue(arr) {let max arr[0];for (let i 1; i < arr.length; i) {if (arr[i] > max) {max arr[i];}}return m…

新概念英语第二册(18)

【New words and expressions】生词和短语&#xff08;3&#xff09; pub n. 小酒店 landlord n. 店主 bill n. 帐单 【Text】 After I had had lunch at a village pub, I looked for my…

【量化】商品期货换月的处理思路(old)

商品期货存在换月的情况&#xff0c;即期货合约是有到期日的&#xff0c;如果不想实物交割就得将持仓转换到之后的合约上&#xff0c;而不同月份的价格是不一样的&#xff0c;也就是不连续的&#xff0c;在回测中需要处理换月带来的跳空&#xff1a; 比如上图中的PG是逐月换月…