mysql的锁是公平的么_lock 默认公平锁还是非公平锁?公平锁是如何定义?如何实现...

ReentrantLock的实现是基于其内部类FairSync(公平锁)和NonFairSync(非公平锁)实现的。 其可重入性是基于Thread.currentThread()实现的: 如果当前线程已经获得了执行序列中的锁, 那执行序列之后的所有方法都可以获得这个锁。

公平锁:

公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。公平锁则在于每次都是依次从队首取值。

锁的实现方式是基于如下几点:

表结点Node和状态state的volatile关键字。

sum.misc.Unsafe.compareAndSet的原子操作(见附录)。

非公平锁:

在等待锁的过程中, 如果有任意新的线程妄图获取锁,都是有很大的几率直接获取到锁的。

ReentrantLock锁都不会使得线程中断,除非开发者自己设置了中断位。

ReentrantLock获取锁里面有看似自旋的代码,但是它不是自旋锁。

ReentrantLock公平与非公平锁都是属于排它锁。

公平锁和非公平锁在说的获取上都使用到了 volatile 关键字修饰的state字段, 这是保证多线程环境下锁的获取与否的核心。

但是当并发情况下多个线程都读取到 state == 0时,则必须用到CAS技术,一门CPU的原子锁技术,可通过CPU对共享变量加锁的形式,实现数据变更的原子操作。

volatile 和 CAS的结合是并发抢占的关键。

公平锁的实现机理在于每次有线程来抢占锁的时候,都会检查一遍有没有等待队列,如果有, 当前线程会执行如下步骤:

/**

* Fair version of tryAcquire. Don't grant access unless

* recursive call or no waiters or is first.

*/

protected final boolean tryAcquire(int acquires) {

final Thread current = Thread.currentThread();

int c = getState();

if (c == 0) {

if (!hasQueuedPredecessors() &&

compareAndSetState(0, acquires)) {

setExclusiveOwnerThread(current);

return true;

}

}

else if (current == getExclusiveOwnerThread()) {

int nextc = c + acquires;

if (nextc < 0)

throw new Error("Maximum lock count exceeded");

setState(nextc);

return true;

}

return false;

}

其中hasQueuedPredecessors是用于检查是否有等待队列的。

非公平锁在实现的时候多次强调随机抢占:

/**

* Performs lock. Try immediate barge, backing up to normal

* acquire on failure.

*/

final void lock() {

if (compareAndSetState(0, 1))

setExclusiveOwnerThread(Thread.currentThread());

else

acquire(1);

}

当当前拥有锁的线程释放锁之后, 且非公平锁无线程抢占,就开始线程唤醒的流程。

通过tryRelease释放锁成功,调用LockSupport.unpark(s.thread); 终止线程阻塞

private void unparkSuccessor(Node node) {

// 强行回写将被唤醒线程的状态

int ws = node.waitStatus;

if (ws < 0)

compareAndSetWaitStatus(node, ws, 0);

Node s = node.next;

// s为h的下一个Node, 一般情况下都是非Null的

if (s == null || s.waitStatus > 0) {

s = null;

// 否则按照FIFO原则寻找最先入队列的并且没有被Cancel的Node

for (Node t = tail; t != null && t != node; t = t.prev)

if (t.waitStatus <= 0)

s = t;

}

// 再唤醒它

if (s != null)

LockSupport.unpark(s.thread);

}

非公平锁性能高于公平锁性能的原因:

在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。

假设线程A持有一个锁,并且线程B请求这个锁。由于锁被A持有,因此B将被挂起。当A释放锁时,B将被唤醒,因此B会再次尝试获取这个锁。与此同时,如果线程C也请求这个锁,那么C很可能会在B被完全唤醒之前获得、使用以及释放这个锁。这样就是一种双赢的局面:B获得锁的时刻并没有推迟,C更早的获得了锁,并且吞吐量也提高了。

当持有锁的时间相对较长或者请求锁的平均时间间隔较长,应该使用公平锁。在这些情况下,插队带来的吞吐量提升(当锁处于可用状态时,线程却还处于被唤醒的过程中)可能不会出现。

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

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

相关文章

企业性质

有限责任公司(国有控股) 有限责任公司(自然人投资或控股) 其他有限责任公司 有限责任公司(外国法人独资) 股份有限公司(非上市、国有控股) 有限合伙企业 有限责任公司(非自然人投资或控股的法人独资) 有限责任公司(外国法人独资) 有限责任公司(国有独资) 有限责任公司(台港澳法…

常用jdk的命令行工具:_jhsdb:JDK 9的新工具

常用jdk的命令行工具:我喜欢在分析性能和基于Java的应用程序的其他问题的早期步骤中使用JDK随附的命令行工具&#xff0c;并在诸如jcmd &#xff0c; jps &#xff0c; jstat &#xff0c; jinfo &#xff0c; jhat和jmap &#xff0c; jrunscript &#xff0c; jstack之类的 工…

佳能2900打印机与win10不兼容_佳能2900打印机和惠普1020哪种好 佳能2900打印机和惠普1020对比【详解】...

现在的人们早已经习惯遇到身边美丽的景色&#xff0c;就用手机进行拍摄下来了&#xff0c;若想长久的留住这一刻的美好&#xff0c;拥有一台 打印机 就是很不错的选择&#xff0c;如今打印机的需求量在不断的增加&#xff0c;市面上的打印机品牌也在不断的增多&#xff0c;我们…

Sublime Text for Windows的快捷键

文章目录选择文本移动光标编辑类查找/替换窗口显示书签其它选择文本 快捷键说明CtrlD先选中文本&#xff0c;再按CtrlD&#xff0c;会选中下一个相同的文本&#xff0c;再继续按D(Ctrl不放)则会选中下一个相同的文本&#xff0c;可以同时编辑被选中的文本AltF3选中文本按下快捷…

mysql 多表查询 join on_mysql多表查询

在做连表查询的时候&#xff0c;可以在联合的字段上面&#xff0c;分别加上索引字段&#xff0c;这样有加快搜索的速度左右连表查询时条件放在on后面和where后面的执行时机是不一样的例如test1表test2表执行SELECT * FROM test1 t1 LEFT JOIN test2 t2ON t1.not2.no AND t2.nam…

java 多模块模块变灰色_到底谁需要Java模块?

java 多模块模块变灰色拼图问题为1000。我作为X想要JPMS模块。 如果不是平台开发人员&#xff0c;X是什么&#xff1f; 我的回答是X是人&#xff08;减去平台开发人员&#xff0c;因为那是一个条件&#xff09; 。 我们都需要模块系统具有更安全的代码&#xff0c;从而产生更可…

python如何保持数据类型不变_python 可变和不可变数据类型、格式化输出和基础运算符...

一、可变类型和不可变类型#可变类型&#xff1a;在id不变的情况下&#xff0c;value可以变&#xff0c;则称为可变类型&#xff0c;如&#xff1a;列表&#xff0c;字典#不可变类型&#xff1a;value一旦改变&#xff0c;id也改变&#xff0c;则称为不可变类型(id变&#xff0c…

MacBook Air的命令终端如何在root和普通用户之间切换

有时你需要在一些root级别的目录下创建和删除文件&#xff0c;如果你没有切换到root用户下&#xff0c;系统会提示你没有权限&#xff0c;如下所示&#xff1a; liaowenxiongdeMacBook-Air:local liaowenxiong$ mkdir test mkdir: test: Permission denied liaowenxiongdeMacB…

mysql导入数据显示进度条_导入数据思路+进度条

/// ///基础数据导入/// private voidLoadBasicData(){this.NowCount 0;this.AllCount 0;this.hasResult false;try{DelegateShowProssBar mi newDelegateShowProssBar(ShowProcessBar);this.BeginInvoke(mi, new object[] { "导入基础数据", "导入数据"…

redis key失效的事件_《分享几道高频 Redis 高频面试题,面试不用愁》

1、说说 Redis 都有哪些应用场景&#xff1f;缓存&#xff1a;这应该是 Redis 最主要的功能了&#xff0c;也是大型网站必备机制&#xff0c;合理地使用缓存不仅可以加 快数据的访问速度&#xff0c;而且能够有效地降低后端数据源的压力。共享Session&#xff1a;对于一些依赖 …

mysql按加号没反应_请各位大哥给小老弟解疑答惑一下 为什么点击加号没有反应?感谢...

事件function count(){var sum;//获取第一个输入框的值var aparseFloat(document.getElementById("txt1").value);//获取第二个输入框的值var bparseFloat(document.getElementById("txt2").value);//获取选择框的值var cdocument.getElementById("se…

解决文件内容的中文乱码_字符集_字符编码_字符编码方案

从第三方下载的java源文件&#xff0c;打开查看里面的中文全部是乱码&#xff0c;无论你使用什么字符编码集都无法正常显示&#xff0c;该文件是用UTF-8编码存档的&#xff0c;使用UTF-8解码也同样是乱码&#xff0c;相信很多人遇到类似的问题&#xff0c;我这里解决过一个经典…

安卓清理垃圾清理代码_从战中清理代码

安卓清理垃圾清理代码从战中清除代码–验证 让我们直接从一个例子开始。 考虑一个简单的Web服务&#xff0c;该服务允许客户向商店下订单。 订单控制器的非常简化的版本可能如下所示– RestController RequestMapping(value "/",consumes MediaType.APPLICATION_J…

rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait

缘起一切都要从年末换工作碰上特殊时期, 在家闲着无聊又读了几首诗, 突然想写一个可以浏览和背诵诗词的 TUI 程序说起. 我选择了 Cursive 这个 Rust TUI 库. 在实现时有这么一个函数, 它会根据参数的不同返回某个组件(如 Button, TextView 等). 在 Cursive 中, 每个组件都实现了…

Sublime Text for Mac的快捷键

文章目录选择文本移动光标编辑文本查找/替换窗口显示书签和标记其它选择文本 快捷键说明CommandD先选中文本&#xff0c;再按CommandD&#xff0c;会选中下一个相同的文本&#xff0c;再继续按D(Command不放)则会选中下一个相同的文本&#xff0c;可以同时编辑被选中的文本Con…

zip unzip_zip和unzip上的Java要点

zip unzip压缩是编写文件时可以在我们的代码中发出的主要动作之一。 因此&#xff0c;我发现在zip和unzip上必不可少的简单Java代码段&#xff0c;并且必须易于访问。 要点是纯Java语言&#xff0c;并以zip格式存储两个文件。 完成后&#xff0c;打开打开的拉链并评估其内容。…

mysql不支持子查询_MySQL不支持子查询优化一例

一创建表 create table tt1(id int primary key, c1 INT);create table tt2(id int primary key, c2 INT);insert into tt1 value一创建表create table tt1(id int primary key, c1 INT);create table tt2(id int primary key, c2 INT);insert into tt1 values(1,1),(2,2),(3,3…

nginx配合python_人生苦短我用python[0x02] nginx与python结合

原标题&#xff1a;人生苦短我用python[0x02] nginx与python结合**文章内容为原创&#xff0c;欢迎转载请注明出处**背景nginx是一款高性能的http服务器&#xff0c;python是一门无论做系统开发还是业务逻辑开发都是非常不错的动态语言&#xff0c;现在流行微服务&#xff0c;微…

Linux 文件颜色含义

目录文件&#xff1a;蓝色 一般文件&#xff1a;白色 符号链接&#xff1a;紫色 设备文件&#xff1a;黄色 可执行文件&#xff1a;绿色 链接文件&#xff1a;青色 图片文件&#xff1a;粉红色 压缩文件&#xff1a;红色 其它文件&#xff1a;灰色 链接文件&#xff1…

Mysql索引使用情况_介绍mysql索引失效的情况

mysql视频教程栏目索引失效的情况。索引对于MySQL而言&#xff0c;是非常重要的篇章。索引知识点也巨多&#xff0c;要想掌握透彻&#xff0c;需要逐个知识点一一击破&#xff0c;今天来先来聊聊哪些情况下会导致索引失效。图片总结版相关免费学习推荐&#xff1a;mysql视频教程…