一分钟理解Java公平锁与非公平锁

转载自  一分钟理解Java公平锁与非公平锁

和朋友聊天他提到:ReentrantLock 的构造函数可以传递一个 bool 数据,true 时构造的是“公平锁”、false 时构造的是“非公平锁”。我的印象中锁是不区分类型的,所以认为这应该是 Java 发明的概念,于是就恶补了一下。

锁的底层实现

无论什么语言在操作系统层面锁的操作都会变成系统调用(System Call),以 Linux 为例,就是 futex 函数,可以把它理解为两个函数: futex_wait(s),对变量 s 加锁;futex_wake(s)释放 s 上的锁,唤醒其他线程。

如果你熟悉操作系统原理其实就是 P/V 操作

Java 公平锁和非公平锁

公平锁的 lock 操作是调用futex_wait,unlock 操作是调用futex_wake。比如下面的代码

 

非公平锁的 lock/unlock 操作会先做一次 CAS 操作然后再调用 futex_wait、futex_wake。比如下面的代码

 

在上锁之前增加了一个 CAS 原子操作,它接受三个变量可以把它理解为下面的逻辑:

 

第一个参数的值和第二个参数不相等则返回 0 表示操作失败否则更新为新的值。这个函数不是由代码实现的而是 CPU 提供的一个指令,比如 Intel 的叫 cmpxchg;高级语言进行了封装,比如 Java 的 Atomic 变量。

为什么

明白了原理再来提问为什么,在上锁之前先通过 CAS 修改一个变量表示“我要上锁”了看似很冗余的操作,其实它是一次自旋,如果资源很快被使用完可以提高系统的吞吐率。考虑下面的场景

上锁之前的时间是 t1,上锁之后是 t2(使用资源),释放锁是 t3。现在有两个线程,处于 t1 状态,其中 A 线程先抢到资源处于 t2 ;B 线程也会尝试 lock,与此同时 t2 释放了,而 lock 动作也执行成功了 B 被挂起;系统继续执行 A 释放成功唤醒 B 继续执行。上述过程中 B 只要再多等待“一丢丢”就不用被挂起,直接获得资源继续执行。非公平锁的 CAS 操作就是为了增加一丢丢时间。

采用非公平锁,如果系统中有 3 个线程执行,A 抢到资源,C 没有抢到处于挂起状态,此时 B 尝试 CAS 操作,而 A 刚好释放掉资源还没有来得及唤醒 C,那么 B 会先抢到资源,在 C 之前执行。这就是“非公平”的来历,虽然 C 老老实实的等待了很长时间,但是 B 的“时机”把握的好,迅速“插队”完成资源抢占。

总结

上锁的过程本身也是有时间开销的,如果操作资源的时间比上锁的时间还短建议使用非公平锁可以提高系统的吞吐率;否则就老老实实的用公平锁。

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

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

相关文章

为什么你需要将代码迁移到ASP.NET Core 2.0?

随着 .NET Core 2.0 的发布,.NET 开源跨平台迎来了新的时代。开发者们可以选择使用命令行、个人喜好的文本编辑器、Visual Studio 2017 15.3 和 Visual Studio Code 来开发自己的 .NET Core 2.0 项目。同时,微软 .NET 开发工具组也宣布了 ASP.NET Core 2…

typedef用法

#include<stdio.h> typedef struct Student {int age;int score;}St; int main(){St st{200,100};//等价于 struct Student st 直接命名&#xff0c;省略/很多不必要步骤 printf("%d",st.age);}typedef的核心在于指针而不是仅仅简化了结构 #include<stdi…

jeecg-boot中如何放开接口路由

大家好&#xff0c;我是雄雄。 前言 今天是国庆假期的第5天了&#xff0c;7天的时间&#xff0c;感觉过的挺快&#xff0c;前三天都在下雨&#xff0c;后四天降温冻的瑟瑟发抖。 这次假期完事儿了之后就到元旦&#xff0c;春节了&#xff0c;得好好的珍惜。 今天介绍一下&…

nssl1174-阶乘【!基础!数论】

前言 比赛时xjq说这道题很水&#xff0c;是个基础数论。 然后… 就连交都没交 正题 给出n个数&#xff0c;求一个最小的mmm使得 m!∏i1naiq(q∈N)\frac{m!}{\prod_{i1}^na_i}q(q\in N_)∏i1n​ai​m!​q(q∈N​) 解题思路 我们考虑因为要求在一起的乘积&#xff0c;所以个体…

带着小C看动物

大家好&#xff0c;我是雄雄。 整个国庆假期期间&#xff0c;一出门就背着我的小C书包出去。 第一天带着我对象的妈妈去医院检查了下&#xff0c;然后去原来酒店老板那喝羊汤。第二天准备去我对象家的东西&#xff0c;去超市买了一后备箱&#xff0c;晚上就去她家了趟&#xf…

弹性和瞬态故障处理库Polly介绍

前言本节我们来介绍一款强大的库Polly&#xff0c;Polly是一种.NET弹性和瞬态故障处理库&#xff0c;允许我们以非常顺畅和线程安全的方式来执诸如行重试&#xff0c;断路&#xff0c;超时&#xff0c;故障恢复等策略。 Polly针对对.NET 4.0&#xff0c;.NET 4.5和.NET Standar…

一分钟理解Java包装类型

转载自 一分钟理解Java包装类型 Java 一直标榜自己是一个纯粹的面向对象语言&#xff0c;自作聪明的为所有的值类型都提供相应的引用类型&#xff08;不明白这两个概念&#xff0c;看之前的《一分钟理解传值和传引用》&#xff09;比如&#xff1a;int 类型对应的有 Integer&…

SQL Server 2017 正式发布

SQL Server 2017 跨出了重要的一步&#xff0c;它力求通过将 SQL Server 的强大功能引入 Linux、基于 Linux 的 Docker 容器和 Windows&#xff0c;使用户可以在 SQL Server 平台上选择开发语言、数据类型、本地开发或云端开发&#xff0c;以及操作系统开发。微软拥抱开源的脚步…

关于链表的简单创建和遍历

这是网上的的源码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <malloc.h>// 定义链表中的节点 typedef struct node {int member; // 节点中的成员struct node *pNext; // 指向下一个节点的指针 }Node,*…

可能是最全面的 Java G1学习笔记

转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题&#xff0c;我自己去年有专门学过一次G1&#xff0c;但是当时只是看了个皮毛&#xff0c;因此自己也有不少问题。总体来讲&#xff0c;对于G1我有几个疑惑&#xff0c;希望能够在这篇文章中…

微服务~Eureka实现的服务注册与发现及服务之间的调用

微服务里一个重要的概念就是服务注册与发现技术&#xff0c;当你有一个新的服务运行后&#xff0c;我们的服务中心可以感知你&#xff0c;然后把加添加到服务列表里&#xff0c;然后当你死掉后&#xff0c;会从服务中心把你移除&#xff0c;而你作为一个服务&#xff0c;对其它…

新高考增值评价系统业务简单介绍(超详细,图文并茂)

大家好&#xff0c;我是雄雄。 文章目录一&#xff1a;基本信息1&#xff1a;学校信息2&#xff1a;教师管理1&#xff1a;下载教师模板2&#xff1a;上传教师模板3&#xff1a;查看教师数据4&#xff1a;教师信息编辑5&#xff1a;新增教师6&#xff1a;导出教师数据3&#xf…

一步一步详解高斯日记

这是有一年的蓝桥杯的题目&#xff0c;感觉挺有趣的 意思就是高斯有个习惯&#xff0c;记日期的时候喜欢只用数字来记&#xff0c;比如如果你2001年一月一日出生的话&#xff0c;你活到2002年1 月一日&#xff0c;他就会写个366。大致意思就是你现在的时间减去个出生的时间1就是…

微服务配置中心实战:Spring + MyBatis + Druid + Nacos

转载自 微服务配置中心实战&#xff1a;Spring MyBatis Druid Nacos 很多基于 Spring MVC 框架的 Web 开发中&#xff0c;Spring MyBatis Druid 是一个黄金组合&#xff0c;在此基础上如果融入一个配置中心&#xff0c;会发生什么特别的变化呢&#xff1f; 本文将通过一…

揭晓新版《Windows Sysinternals实战指南》读书积赞活动

参与新版《Windows Sysinternals实战指南》&#xff0c;读书积赞活动的一下三位同学&#xff08;想法构成&#xff0c;我zzz&#xff0c;kergee&#xff09;&#xff0c;请加我微信geffzhang&#xff0c;把姓名&#xff0c;地址和手机号发给我&#xff0c;后续给你们寄书。.NET…

Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

转载自 Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件&#xff1a;Spring Cloud Gateway &#xff0c;相比之前我们使用的 Zuul&#xff08;1.x&#xff09; 它有哪些优势呢&#xff1f;Zuul&#xff08;1.x&…

ASP.NET Core中如何调整HTTP请求大小的几种方式

一、前言 一般的情况下&#xff0c;我们都无需调用HTTP请求的大小&#xff0c;只有在上传一些大文件&#xff0c;或者使用HTTP协议写入较大的值时&#xff08;如调用WebService&#xff09;才可能会调用HTTP最大请求值。 在ASP.NET Core 2.0中&#xff0c;它的两个宿主服务器Ke…

csdn颜色字体的改变

一直想改变一下csdn界面字体的颜色&#xff0c;奈何csdn上没有像Word那样直接改变字体颜色的版面&#xff0c;找半天没找到&#xff0c;后来才知道必须输入代码才能改变字体颜色&#xff0c;这个就很高级了啊 <font face"微软雅黑" color#FF8C00 size2> **一…

ASP.NET Core 2.0 使用支付宝PC网站支付

前言 最近在使用ASP.NET Core来进行开发&#xff0c;刚好有个接入支付宝支付的需求&#xff0c;百度了一下没找到相关的资料&#xff0c;看了官方的SDK以及Demo都还是.NET Framework的&#xff0c;所以就先根据官方SDK的源码&#xff0c;用.NET Standard 2.0 实现了支付宝服务端…

mysql实现查询分组查询最后一次的记录

大家好&#xff0c;我是雄雄。 前言 又好久没有写博客了&#xff0c;为什么呢&#xff1f;因为最近没怎么写代码…说起来也惭愧。 今天在项目上遇到了个需求&#xff0c;是这样的&#xff1a;我们数据库中有一表检测记录表&#xff0c;该表中存储的是所有居民每次的检测记录&…