2017做网站挣钱/万网商标查询
Java 锁 面试题(ReentrantLock、synchronized)
- 1. 锁
- 2. ReentrantLock
- 2.1 ReentrantLock 的实现原理
- 2.2 AQS 是什么?
- 2.3 CAS 是什么?
- 3. synchronized
- 3.1 synchronized 的实现原理
- 3.2 synchronized 的锁升级过程
- 3.2.1 无锁
- 3.2.2 偏向锁
- 3.2.3 轻量级锁
- 3.2.4 重量级锁
- 3.2.5 自旋锁
- 3.2 synchronized 和 volatile 的区别
- 4. synchronized和ReentrantLock的区别
- 4.1 什么是可重入锁?
- 4.2 什么是乐观锁和悲观锁?(简要回答)
- 4.3 什么是自旋锁?(简要回答)
- 4.4 什么是公平锁和非公平锁?(简要回答)
- 4.5 什么是死锁?如何避免(简要回答)
1. 锁
常用和锁、线程安全相关的工具:synchronized、ReentrantLock、AtomicInteger、AtomicLong、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet
2. ReentrantLock
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkCZHf8l-1685216539209)(…/images/imagehello.png)]
2.1 ReentrantLock 的实现原理
ReentrantLock 是基于 AQS(AbstractQueuedSynchronizer)实现的,AQS 是一个用于构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如常用的 ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock、ThreadPoolExecutor 等。
2.2 AQS 是什么?
AQS 内部维护了一个 volatile int state 和一个 FIFO 队列,state 用于表示同步状态,FIFO 队列用于存放获取同步状态失败的线程。
2.3 CAS 是什么?
CAS(Compare And Swap)是一种无锁算法,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
3. synchronized
3.1 synchronized 的实现原理
Java 中的对象监视器(monitor)实现的。每个对象都有一个 monitor,monitor 可以和任意个线程关联,线程可以通过调用对象的 wait() 和 notify() 方法来与 monitor 进行交互。
线程执行 wait() :会让自己进入 monitor 的等待队列,并且释放 monitor 上的所有锁。
线程执行 notify() :会从等待队列中随机选择一个线程,并将其唤醒,被唤醒的线程则进入 monitor 的锁定队列,等待获取 monitor 上的锁。当线程执行完毕退出 synchronized 代码块时,会释放 monitor 上的所有锁,此时被唤醒的线程可以获取 monitor 上的锁,继续执行。
3.2 synchronized 的锁升级过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1amvKo6G-1685216539210)(…/images/image-111.png)]
synchronized 的锁升级过程分为四个阶段:无锁、偏向锁、轻量级锁和重量级锁。
简述升级过程:
无锁
↓
偏向锁:当一个线程访问同步块并获取锁时,如果该同步块没有被锁定,那么该线程会尝试获取该同步块的偏向锁,并将对象头中的 Mark Word 设置为偏向锁。如果该同步块已经被其他线程锁定,那么该线程会尝试获取该同步块的轻量级锁。
↓
轻量级锁:当一个线程尝试获取一个同步块的锁时,如果该同步块没有被锁定,那么该线程会尝试获取该同步块的轻量级锁,并将对象头中的 Mark Word 设置为指向线程栈帧的指针。如果该同步块已经被其他线程锁定,那么该线程会尝试获取该同步块的重量级锁。
↓
重量级锁:当一个线程尝试获取一个同步块的锁时,如果该同步块已经被其他线程锁定,那么该线程会进入阻塞状态,直到该同步块的锁被释放。在重量级锁的实现中,JVM 会将对象的 Mark Word 指向一个互斥量,从而实现线程的阻塞和唤醒。
3.2.1 无锁
无锁状态下,线程可以随意进入临界区,不需要进行任何同步操作。
3.2.2 偏向锁
偏向锁(只使用于没有竞争的场景下),如果一个现场获取了锁,在未来的一段时间内,该线程可能在此获取这个锁,JVM会偏向于这个线程。
3.2.3 轻量级锁
轻量级锁(只使用于没有竞争的场景下),如果一个现场获取了锁,在未来的一段时间内,该线程可能在此获取这个锁,JVM会偏向于这个线程。
3.2.4 重量级锁
重量级锁(只使用于有竞争的场景下),如果一个现场获取了锁,在未来的一段时间内,该线程可能在此获取这个锁,JVM会偏向于这个线程。
3.2.5 自旋锁
自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环等待,直到该锁被释放为止,线程不会被挂起,而是处于忙等状态,因此自旋锁一般适用于锁保护的临界区比较小的情况。
3.2 synchronized 和 volatile 的区别
synchronized 用于保证同一时间只有一个线程可以访问被 synchronized 修饰的代码,而 volatile 用于保证多个线程之间对变量的可见性。
4. synchronized和ReentrantLock的区别
- synchronized是Java关键字,ReentrantLock是类
- synchronized相比,ReentrantLock提供了一些高级功能,主要有以下三项:
- 等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于synchronized来说可以避免出现死锁的情况
- 公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过传入true创建公平锁
- 锁绑定多个条件,一个ReentrantLock对象可以同时绑定多个Condition对象
- synchronized会自动释放锁,ReentrantLock需要手动释放锁,如果不释放锁,就有可能导致死锁
4.1 什么是可重入锁?
可重入锁是指同一个线程可以多次获得同一把锁,而不会被阻塞。ReentrantLock和synchronized都是可重入锁。
4.2 什么是乐观锁和悲观锁?(简要回答)
概念,具体实现方式有很多种。
乐观锁认为数据一般不会造成冲突,所以不会上锁,而悲观锁认为数据一般会造成冲突,所以会上锁。
4.3 什么是自旋锁?(简要回答)
自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
4.4 什么是公平锁和非公平锁?(简要回答)
公平锁是指多个线程按照申请锁的顺序来获取锁,非公平锁是非顺序的,非公平锁的优点在于吞吐量比公平锁大。
4.5 什么是死锁?如何避免(简要回答)
死锁是指两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些线程都将无法推进下去。
避免死锁的方法:
- 设置超时时间
- 死锁检测tryLock
等
我的Github地址,欢迎大家加入我的开源项目,或者(在我的主页联系我)加入你们的开源项目,点点Github-Stars。
\ | 开源项目名称 | 依赖类型 | 版本号 | 描述 |
---|---|---|---|---|
1 | spring-boot-starter-trie | pom | 1.0.0-SNAPSHOT | 特定需求下查询速度远超开源检索工具,innodb下B+树或者ES中倒排索引无法与之比拟. |
2 | spring-boot-starter-trie | jar | 1.0.0-M1 | 提供了基于SpringCloud的服务节点,可以通过Nacos注册中心进行服务发现,实现了树的动态扩容与缩容,以及服务的动态上下线。 |
3 | Data-Provider | pom | 1.0.0-SNAPSHOT | 提供了多种数据源的查询,以及数据的类型同步,作为一个Jar可以依赖在其他服务上动态的提供数据。 |
相关文章:

Java 锁 面试题(ReentrantLock、synchronized)
Java 锁 面试题(ReentrantLock、synchronized) 1. 锁2. ReentrantLock2.1 ReentrantLock 的实现原理2.2 AQS 是什么?2.3 CAS 是什么? 3. synchronized3.1 synchronized 的实现原理3.2 synchronized 的锁升级过程3.2.1 无锁3.2.2 偏…...

Python中的缩进是什么意思?
在Python中,缩进是指在代码中使用空格或制表符来表示代码块的层次结构。Python使用缩进作为语法的一部分,以定义代码的逻辑结构和代码块的范围。缩进在Python中具有以下几个重要的方面和含义。 代码块的开始和结束: 缩进在Python中用于标识代…...

2023年9月数学建模:最小二乘优化、曲线拟合与函数逼近
2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 1. 最小二乘优化 1.1 最小二乘优化的原理 1.2 最小二乘优化的方法...

java8内部调用无法引用值的问题
问题:Variable used in lambda expression should be final or effectively final 具体原因: 这段代码试图将 20 赋给一个局部变量,它无法通过编译,但绝非编写错误。 这实际上是语言的设计者有意为之,用以鼓励用户使用…...

《嵌入式系统》知识总结10:使用位带操作操纵GPIO
位操作 汇编层面 外设控制常要针对字中某个位(Bit)操作 以字节编址的存储器地址空间中,需要3步骤(读出-修改-写回) 1.(从外设)读取包含该位的字节数据 2. 设置该位为0或1、同时屏蔽其他位&am…...

leetcode 2.两数相加(链表操作)
题目描述跳转到leetcode 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外࿰…...

Jenkins是什么?以及Jenkins有哪些具体的应用呢?
Jenkins是一个流行的开源持续集成和持续交付(CI/CD)工具,它可以自动化构建、测试和部署软件项目。以下是Jenkins的一些具体应用场景: 1. 自动化构建和集成:Jenkins可以与代码版本控制系统(如Git、SVN&#…...

2023年数学建模:参数估计与假设检验:自助法(Bootstrap)详解
2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 1. 引言 2. 自助法简介 3. 自助法在参数估计中的应用 3.1 原理...

华为OD机试真题 Java 实现【字符串通配符】【2022Q4 200分】
一、题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: :匹配0个或以上的字符(注:能被和?匹配的字符仅由英文字母和数字0到9组成,下同)?:匹配1个…...

Android 11.0 user模式下解除系统进入recovery功能的限制
1.前言 在11.0的系统rom定制化开发中,系统中recovery模式功能也是很重要的一部分,而在原生系统中,对于debug模式的产品,可以通过电源键和音量+键进入recovery模式, 但是在user模式下的产品,对于通过这种方式,进入recovery模式就受限制了,防止用户无操作为了产品安全等,…...

TDEngine3.0 环境安装、配置及使用经验总结
TDEngine3.0 环境安装、配置及使用经验总结 一、TDengine 介绍二、TDengine的下载三、TDengine Server安装及配置3.1 安装3.2 taos的参数配置3.3 启动3.4 taosAdapter 四、TDengine Client 安装4.1 linux客户端安装4.2 windows客户端安装 五、TDEngine3.x的使用总结 一、TDengi…...

Redis7实战加面试题-高阶篇(Redlock算法和底层源码分析)
当前代码为8.0版接上一步 当前文档源码,接上一篇博客 Redis7实战加面试题-高阶篇(手写Redis分布式锁) 逐步深入,引入Redlock 自研一把分布式锁,面试中回答的主要考点 1.按照UC里面java.util.concurrent.locks.Lock接口规范编写…...

保持Git历史提交整洁,解决冲突
比较常见的场景,在代码提交场景,自己的代码和master冲突了,直接拉取master 解决冲突,很方便快捷,但是这样就会将其他开发同学的commit 拉到我们的分支,团队的代码合入时,需要代码同学帮忙code r…...

CompletableFuture使用详解,多线程相关
CompletableFuture笔记 一. 创建异步任务二.异步回调处理三.多任务组合处理四.总结 原文: https://blog.csdn.net/zsx_xiaoxin/article/details/123898171 CompletableFuture是jdk8的新特性。CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者…...

(3)NUC980 kenerl编译
解压 用到的配置文件位置: /NUC980-linux-4.4.y-master/arch/arm/configs/nuc980_defconfig 执行: 编译linux内核源码。了解其 配置文件在 arch/arm/configs/nuc980_defconfig (1) make nuc980_defconfig 载入配置文件 (2) make menuconfig --->Devi…...

华为OD机试真题 Java 实现【分奖金】【2022Q4 100分】
一、题目描述 公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得“距离 * 数字差值”的奖金。如…...

迅为国产化RK3588开发板在安防前后端应用解决方案
K3588是瑞芯微推出的一款高性能处理器,针对安防领域的应用具备强大的计算能力和图像处理能力。下面是关于RK3588的安防前后端应用解决方案的介绍: 前端摄像头端: 高清视频采集:利用RK3588处理器的高性能图像处理能力,…...

Windows 安装 GCC
文章目录 GCC 是什么?GCC 和 gcc 什么关系?Windows 安装 GCC选型下载安装配置环境变量验证 参考文献 GCC 是什么? GCC(GNU Compiler Collection)是一个开源的编译器套件,由 GNU 项目开发和维护。 GNU 编译…...

下载安装LabVIEW
下载安装LabVIEW 介绍下载安装流程下载安装 后续 介绍 LabVIEW 是 工程 师 用来 开发 自动 化 研究、 验证 和 生产 测试 系统 的 图形 化 编 程 环境。Labview作为图形化编程语言,图形控件拖拽式编程,显得更加直观形象,也很容易上手学习。 …...

从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
目录 1. vector的常用函数 1.1 vector 的介绍 1.2 vector 的初始化 1.3 vector 的操作和遍历 1.4 vector 的容量和增删查改 2. vector 相关笔试题 3. vector 相关OJ题 136. 只出现一次的数字 - 力扣(LeetCode) 解析代码: 118. 杨辉…...

Java NIO-非阻塞I/O(二)
文章目录 1. SocketChannel2. ServerSocketChannel2. Channels类3. 异步通道(Java 7)4. Socket选项5. 就绪选择6. Selector类7. SelectionKey类 1. SocketChannel 通道将缓冲区的数据块移入或移出到个汇总给你I/O,如文件、Socket、数据报等。…...

PaaS平台iuap——数智底座支撑企业的全球化业务拓展
数智化转型是全球化企业非常关注的话题,数智化转型过程中suo 面临的问题与挑战也绝非一套简单的产品能够解决的,必须配合组织、人员、目标制度采用达成目标。iuap平台是整个企业数智化转型的底座,形象来说是我们的土壤,在这个土壤…...

RK3318 android12 HEVC-1080P 4K VP9等格式视频播放不了
同样视频在同样硬件在android10的固件刷机测试播放正常 在android12播放失败,在媒体中心点开视频直接闪退了 在android10 能播放4K视频, 我对比了ddr频率 cat /d/clk/clk_summary | grep ddr android10 clk_ddrmon 0 0 0 24000000 0 0 50000 pclk_ddr 3 3 0 61440000 0 0 5…...

gpt技术简介以及具体应用领域
GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的生成式预训练模型。它是由OpenAI开发的一系列语言模型,其中最著名的是GPT-3。GPT模型通过在大规模文本数据上进行自监督预训练,学习了大量语言知识和语言模式…...

【java】leetcode 二叉树展开为链表
二叉树展开为链表 leetcode114 .二叉树展开为链表解题思路二叉树专题: leetcode114 .二叉树展开为链表 114 leetcode 链接。可以打开测试 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode &#x…...

windows环境, nginx https配置
在 Windows 环境下配置 Nginx 的 HTTPS,需要以下步骤: 1. 安装 OpenSSL 首先需要安装 OpenSSL,可以从官网下载 Windows 版本的 OpenSSL,然后解压到某个目录下,比如 C:\OpenSSL-Win64。 2. 生成 SSL 证书和私钥 使用…...

git 命令
初始化git目录 mkdir git-test cd git-test git init 配置git用户 git config --global user.name "yyuu007" git config --global user.email "12699891yyuu007user.noreply.gitee.com" 克隆远程代码 -b 指定分支 git clone -b dev gitgitee.com:y…...

【高分论文密码】大尺度空间模拟预测与数字制图
详情点击链接:【高分论文密码】大尺度空间模拟预测与数字制图一,R语言空间数据及数据挖掘 1、R语言空间数据 1.1R语言基础与数据科学 1.2R空间矢量数据 1.3R栅格数据2、R语言空间数据挖掘关键技术二,R语言空间数据高级处理技…...

Word控件Aspose.Words教程:使用 C# 读取 SXC 和 FODS 文件
Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose支持流行文件格式处理,并允许…...

代码示范【FabEdge v0.8.0】配置 connector 公开端口
FabEdge项目简介: FabEdge是博云在2021年8月发起,基于Kubernetes 构建的专注于边缘计算场景的容器网络方案,支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少…...