唤醒队列java_Java队列学习第一篇之列介绍

news/2024/10/21 11:26:57/

Java并发之显式锁和隐式锁的区别

f2a2bd6bee3baaa11bd8003fb7c81349.png

在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchronized(下文简称:sync)和lock(下文就用ReentrantLock来代之lock)的区别。

本文主要内容:将通过七个方面详细介绍sync和lock的区别。通过生活case中的X二代和普通人比较大家更容易理解这两者之间的区别

Java中隐式锁:synchronized;显式锁:lock

sync和lock的区别

一:出身不同

从sync和lock的出身(原始的构成)来看看两者的不同。

Sync:Java中的关键字,是由JVM来维护的。是JVM层面的锁。

Lock:是JDK5以后才出现的具体的类。使用lock是调用对应的API。是API层面的锁

sync是底层是通过monitorenter进行加锁(底层是通过monitor对象来完成的,其中的wait/notify等方法也是依赖于monitor对象的。只有在同步块或者是同步方法中才可以调用wait/notify等方法的。因为只有在同步块或者是同步方法中,JVM才会调用monitory对象的);通过monitorexit来退出锁的。

而lock是通过调用对应的API方法来获取锁和释放锁的。

我们通过Javap命令来查看调用sync和lock的汇编指令:

ffbc88bb3dba624414151399f8d9ca09.png

编辑

从编译后的汇编指令,我们也能够清晰的看出sync关键字和lock的区别。

第一不同一句话概述:可以把sync理解为官二代或者是星二代。从娘胎出来自带光环的。Lock就是我们普通努力上进的人。

二:使用方式不同

Sync是隐式锁。Lock是显示锁

所谓的显示和隐式就是在使用的时候,使用者要不要手动写代码去获取锁和释放锁的操作。

我们大家都知道,在使用sync关键字的时候,我们使用者根本不用写其他的代码,然后程序就能够获取锁和释放锁了。那是因为当sync代码块执行完成之后,系统会自动的让程序释放占用的锁。Sync是由系统维护的,如果非逻辑问题的话话,是不会出现死锁的。

在使用lock的时候,我们使用者需要手动的获取和释放锁。如果没有释放锁,就有可能导致出现死锁的现象。手动获取锁方法:lock.lock()。释放锁:unlock方法。需要配合tyr/finaly语句块来完成。

两者用法对比如下:

d428f9385f00334b032120d377b506d2.png

编辑

用生活中的一个case来形容这个不同:官二代和普通人的你在进入机关大院的时候待遇。官二代不需要出示什么证件就可以进入,但是你需要手动出示证件才可以进入。

三:等待是否可中断

Sync是不可中断的。除非抛出异常或者正常运行完成

Lock可以中断的。中断方式:

1:调用设置超时方法tryLock(long timeout ,timeUnit unit)

2:调用lockInterruptibly()放到代码块中,然后调用interrupt()方法可以中断

生活中小case来理解这一区别:官二代一般不会做饭。都会去餐厅点餐等待着餐厅出餐。普通人的你既可以去餐厅等待,如果等待时间长的话,你就可以回去自己做饭了。

四:加锁的时候是否可以公平

Sync;非公平锁

lock:两者都可以的。默认是非公平锁。在其构造方法的时候可以传入Boolean值。

true:公平锁

false:非公平锁

生活中小case来理解这个区别:官二代一般都不排队,喜欢插队的。普通人的你虽然也喜欢插队。但是如果遇到让排队的情况下,你还是会排队的。

Lock的公平锁和非公平锁:

094830dbed00f2bc88a9ca69dc9fd35a.png

五:锁绑定多个条件来condition

Sync:没有。要么随机唤醒一个线程;要么是唤醒所有等待的线程。

Lock:用来实现分组唤醒需要唤醒的线程,可以精确的唤醒,而不是像sync那样,不能精确唤醒线程。

六:从性能比较

3fa93beda9b1614b7d0b16907dd9daf5.png

生活小case理解:在我们一般的认知中,官二代一般都是比较坑爹的吧。但是这几年也有很多官二代或者是富二代改变了态度,端正自己态度,靠自己能力而不是拼爹了。

七:从使用锁的方式比较

0d6ce7c1470c1dc60f5be6d941d2c077.png

wx.jpg

欢迎来聊~


http://www.ppmy.cn/news/241332.html

相关文章

java 显式锁_Java并发之显式锁和隐式锁的区别

Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchronized(下文简称&#…

swift野梦抄袭 taylor_霉霉Taylor Swift今日出新单,歌词甜腻得让我联想到多年前的那位“野梦男主”!...

这些照片 简直让小编在电脑前脸红心跳到不行, 有人问,眼前这位艳福不错的帅小伙是谁? 被霉霉钦点为《Wildest Dreams》MV男主角的他来头可不小哦, 他可是好莱坞著名演员和导演克林特伊斯特伍德(人称东木老爷子)的儿子 ——史考特伊…

c罗讲什么语言教学,你知道C罗、梅西怎么教育孩子吗?

原标题:你知道C罗、梅西怎么教育孩子吗? 世界杯已经拉开帷幕,时间如白马过隙,昔日球场上那些陪伴我们度过青春岁月的巨星的娃都已经慢慢成长起来,掐指一算,十多年后的世界杯,极有可能被这群附有…

php额拍戏,像这种会演戏的演员,给我焊在剧组365天拍戏可以吗?

最近芭姐疯狂 get 到董子健的演技,每晚换台一边《大江大河 2》一边《流金岁月》交叉着看,太直观了! 《大江大河》中,董子健饰演的杨巡虽然戏份不及宋运辉多,但在有限的笔墨中,董子健凭借到位的演技&#xf…

金融计算机怎么学,怎么选,计算机还是金融专业?学姐:看以下4点

经常有朋友问:读金融好还是读计算机好? 金融和计算机是现在最热门的专业,收入高,金融人士和码农简直是金矿的代名词。问这两个专业的好坏,有点像是在问:清华和北大哪个好? 每次我总是回答&#…

被忽视的最美花瓶、白雪公主Lily Collis终于翻红了!

提到最近的大火的美剧,那一定会有《Emily in Paris》的一席之地。这部剧一经播出,便引发一波全球现象级狂热,更是在播出之前无论是从讨论度还是话题度都热度十足。 小编撸完全剧的观后感就一个字:爽! 作为由《欲望都市…

lua论文 lua-an extensible extension language 中文翻译

Lua在葡萄牙语中是月亮的意思。 学习Lua的过程中翻译了这篇96年发表的论文,用作学习,还有有许多翻译不足的地方,希望讨论的小伙伴可以留言。 lua论文翻译 地址 https://www.lua.org/spe.html lua是一个可扩展的扩展性语言 摘要 这篇论文描述…

名校学金融还是计算机,两大热门专业的PK:计算机还是金融专业?怎么选?

原标题:两大热门专业的PK:计算机还是金融专业?怎么选? 本文共计1685字,预计阅读时间5分钟 导读: 计桥2021年重磅推出新栏目,优质文章推荐分享,小桥特地集合一线教育工作大咖&#xf…