公平锁和非公平锁

article/2025/9/27 7:12:10

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。

公平锁
公平锁是指多个线程按照申请锁的顺序来获取锁线程直接进入队列中排队,队列中的第一个线程才能获得锁。公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU 唤醒阻塞线程的开销比非公平锁大。

FairSync,就是当前资源被加锁后,其他所有请求线程按照请求的先后顺序搁置到queue中,当锁被释放放掉,然后严格的按照先进先出的原则一个一个加锁。
就比如生活中去超市购物后买单,只有一个收银台,这个收银台也只能服务一个顾客。当买单的人特别多的时候,大家就需要按照先来后到排队买单。

非公平锁
非公平锁是多个线程加锁时直接尝试获取锁,能抢到锁到直接占有锁,抢不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁,所以非公平锁有可能出现后申请锁的线程先获取锁的场景。非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU 不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死,或者等很久才会获得锁。

假设有一口水井,有管理员看守,管理员有一把锁,只有拿到锁的人才能够打水,打完水要把锁还给管理员。每个过来打水的人都要管理员的允许并拿到锁之后才能去打水,如果前面有人正在打水,那么这个想要打水的人就必须排队。管理员会查看下一个要去打水的人是不是队伍里排最前面的人,如果是的话,才会给你锁让你去打水;如果你不是排第一的人,就必须去队尾排队,这就是公平锁。

NonfairSync 非公平的意思就是管你三七二十一,我先尝试给共享资源加锁,如果加锁成功就阻塞其他线程(因为其他线程都在队列中排队,这个时候就特别的霸道而显得不公平),如果是共享资源上已经被加锁了,这个时候还要再判断下能不能加锁,两次尝试加锁都失败再霸道也没用了,就只能老老实实去队列尾部排队!
还是去超市购物后买单,只有一个收银台,这个收银台也只能服务一个顾客。当买单的人特别多,大家都排着队等着。这个时候来了个壮汉,仗着自己高大枉顾排队的游戏规则,直接跑到收银台看有没有人正在买单,如果没有人正在买单就直接插队买单。如果看了两眼还是有人正在买单,那就规规矩矩到队尾排队。

但是对于非公平锁,管理员对打水的人没有要求。即使等待队伍里有排队等待的人,但如果在上一个人刚打完水把锁还给管理员而且管理员还没有允许等待队伍里下一个人去打水时,刚好来了一个插队的人,这个插队的人是可以直接从管理员那里拿到锁去打水,不需要排队,原本排队等待的人只能继续等待。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

hasQueuedPredecessors:有排队的先前的人

hasQueuedPredecessors方法其实就是判断当前线程的节点是不是头节点的下一个节点,如果是则允许进入锁,如果不是则不允许,从而达到了公平锁的效果。

公平锁就是根据排队来获取锁(数据结构其实是一种双向链表的节点),排在前面的先获取锁。


http://chatgpt.dhexx.cn/article/cVOcNvOk.shtml

相关文章

阿里面试官:说一下公平锁和非公平锁的区别?

点赞再看,养成习惯,微信搜索【三太子敖丙】关注这个互联网苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 前言 上次我们提到了乐观锁和悲观锁,那我们知道…

Ubuntu 手动安装 JDK8

文章目录 1. 下载2. 解压安装3. 配置环境变量 1. 下载 先去官网下载合适的版本,官网:https://www.oracle.com/java/technologies/downloads/archive/ 通过下载页面获取到下载链接后,可以直接在Ubuntu上使用wget下载,也可以先下载…

centos8安装jdk教程

文章目录 一、安装二、配置环境变量三.验证 一、安装 1、查看JDK软件包列表 yum search java | grep -i --color jdk2、选择版本安装 yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel或者如下命令安装jdk8所有文件 yum install -y java-1.8.0-openjdk*二、配置…

Java - JDK8安装及配置环境变量教程

Java - JDK8安装及配置环境变量教程 一、安装JDK教程 甲骨文官网下载JDK版本:windows64下载地址 下载完成后开始安装JDK:双击打开 点击下一步: 若不需要自定义路径,则安装到默认路径即可(安装的路径需记住&#xff0…

JDK8安装和环境配置

JDK8的安装和环境配置 一、JDK8下载二、安装三、环境配置 一、JDK8下载 官网下载: https://www.oracle.com/java/technologies/downloads/#java8-windows 二、安装 打开安装,一直下一步即可,可以在安装过程中更改安装地址,我放…

Java JDK 8的安装与配置

文章目录 前言1. 安装JDK 8Step1:选择JDK的版本Step2:选择系统平台Step3:下载安装包Step4:开始安装 2. 配置JDK 8Step1:配置“环境变量path” 前言 本教程是在Windows 64位平台上安装JDK 8版本。 1. 安装JDK 8 官网…

JDK8安装与环境配置

前言:在网上看了下JDK的安装与环境配置,发现很多视频以及博客的讲的都很复杂,对初学者很不友好。很多小白看到这些配置步骤都一脸懵,即使一步一步看着操作还是配置失败。这主要是因为很多博主配置了不需要的配置环境,让…

Linux安装JDK8详细图文教程

第一步、获取JDK文件 JDK下载包:直接进入 如果跳转登录页面,注册一个账号登录即可 登录过后文件就下载完成 第二步、上传JDK到服务器 1、创建JDK目录 mkdir -p /developer/env/jdk进入目录 cd /developer/env/jdk2、安装lrzsz(用于远程传…

JDK8安装教程(Windows、Ubuntu)

文章目录 下载JDK8在Windows上安装设置环境变量 在Ubuntu上安装 下载JDK8 Linux版,CSDN下载地址 推荐官网下载(需要注册),能下到Windows和Ubuntu的最新版 在Windows上安装 双击打开下载好的安装包,点击下一步 点击左…

linux系统安装jdk8详细教程

文章目录 前言一、下载jdk8的安装包二、压缩包上传解压1.将下载好的压缩包使用ftp工具上传到服务器2.将压缩包解压到指定目录 三、配置jdk的环境变量四、测试是否安装成功 前言 虚拟机版本:centos7 jdk版本:1.8 一、下载jdk8的安装包 方法1&#xff1a…

jdk8安装教程及环境变量配置

目录 一、JDK下载 二、安装JDK 三、环境变量配置 四、测试环境变量 一、JDK下载 1、JDK下载地址:Java Downloads | Oraclehttps://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2、选这个位置 3、向下滑动鼠标&#xff0c…

WIN10javaJDK8安装教程

一、下载jdk8文件 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载步骤: 1、进入网站后往下拉,找到下载界面,选择自己合适的下载。 二、安装 双击运行刚下载好的exe文件…

JDK8安装教程-极其详细

下载安装JDK 前往oracle官网下载JDK 链接:https://www.oracle.com/java/technologies/downloads/#java8-windows下载完成后 打开下载的程序进行安装JDK 这里可以选择你要存放的位置 选择jre安装的路径 继续下一步,等待安装完成 配置环境变量 此电脑…

jdk8安装教程及环境变量部署

一、jdk下载 下载方式: 官网下载 地址:Java Downloads | Oracle网盘下载:链接:https://pan.baidu.com/s/1jjcOsdyaLfAy2N5zp64sew 提取码:tzsj 官网下载: 这是最新版本的可以根据自己的需要选择 选择W…

win10系统安装jdk8全过程

一 下载安装文件 jdk的安装与配置是Java学习的第一步,下面记录一下具体过程。首先根据自己系统下载对应版本。下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二 安装 双击exe文件,按照默认设置一步一步…

JDK8下载安装及配置环境教程,一看就会

目录 一.下载安装包 二.安装步骤 三.配置环境 一.下载安装包 百度网盘链接:百度网盘 请输入提取码 提取码:QI20 也可以选择自己到ORACLE官网下载:www.oracle.com. 1.点击链接进入官网 可以看到上方有个"Products",点击它 2.然后可以看到下滑的菜单…

JDK8详细图文安装教程

1、双击软件 2、点击下一步 3、选择jdk的安装目录 4、安装jre环境,选择jre安装目录 5、配置环境变量:选中计算机→右键→属性→高级系统设置→高级→环境变量 6、系统变量→新建JAVA_HOME变量 7、系统变量→寻找Path变量→编辑 8、新增jdk、jre的bin位置…

手把手教你安装JDK8~

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JDK8安装教程一、JKD8下载及安装流程1、浏览器搜索jdk8,进入官网网站进行下载2、选择相应操作系统进行下载,(作者是windows系统&…

JDK8安装教程

曾几何时,我安装JAVA环境的时候,需要一遍一遍的对照着百度教程 配置环境变量。而且还经常出问题,只是这个环境变量的配置估计就劝退了一大帮人。 随着学习的深入以及后面JAVA版本的更新,突然发现,JAVA是不需要手动配置…

(超详细)2022年最新版java 8( jdk1.8u321)安装教程

2022年最新版java 8( jdk1.8u321)下载及安装 JunLeon——go big or go home 目录 2022年最新版java 8( jdk1.8u321)下载及安装 一、环境准备 jdk下载 二、jdk安装 三、配置环境变量 1、配置Java 8的环境变量 2、验证是否安…