【Java并发】聊聊并发编程中的锁

在并发编程中,引入了多线程进行提升程序的性能,但是也由此引入了并发线程数据安全问题,而为了解决这个问题,就出现各种同步与互斥机制,而各种锁其实就是在每个不同的场景下进行使用。所以本篇主要介绍java并发中的锁。

乐观锁

乐观锁的含义是认为数据大多数情况下都是同一个线程进行访问和修改的,所以再读取数据的时候判断数据不会被别的线程修改。实现机制就是CAS或者时间戳,适用的场景其实就是读多写少的场景。是一种无锁的方式,可以提高性能。原子类就是一种乐观锁。

悲观锁

悲观锁其实就是认为数据可能随时被其他线程修改,所以适用的时候要加上锁进行互斥。当适用完之后,在释放锁。但是因为锁而导致整体性能会慢。适用场景是写多读少。 syn、lock。

公平锁

公平锁本质是通过将执行的线程,都可以获取到执行权限,按照队列的方式进行执行。但是这种方式可能导致比较重要的任务长时间得不到执行,出现锁饥饿问题。reentrantLock(true)

非公平锁

非公平锁与公平锁是互斥的,非公平锁可以通过竞争锁来获取执行权限。syn lock 都是非公平锁。并且非公平锁可以减少多线程切换的时间,吞吐量可以提升上去。

可重入锁

可冲入锁其实就是在获取到锁之后,如果内层还有同一把锁是否可以在进入,syn lock都是公平锁,syn的本质是通过内部记录获取锁的次数,加锁和减少都进行+1 和 -1的操作 去判断。syn有类锁和对象锁。一般建议在锁的粒度不要大,因为这种容易出现线程阻塞。尤其在高并发场景的情况下。可冲入锁也可以避免锁死锁。CAS

死锁

面试中经常会要求写一个死锁,其实比较简单,就是线程1持有A锁,获取B锁,线程2持有B锁,获取A锁。导致互相都不能持有需要的资源,所以就出现了死锁的线程。而在程序中要避免写出死锁。

读写锁

读写锁其实就是为了解决写和读的场景下进行分离,读读不互斥,读写互斥,写写互斥。在读多写少的场景下,可以高效的利用读写锁的读性能。

自旋锁

是指尝试获取锁的线程不会立即阻塞,当线程发现锁被占用时,会不断循环判断锁的状态,直到获取。这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

邮戳锁

无锁→独占锁→读写锁→邮戳锁 有没有比读写锁更快的锁?StampedLock

syn锁升级

syn这里就不说了,可以参考之前的博客,本质就是从无锁到偏向锁到轻量级锁到重量级锁。

小结

相关推荐
福兮说4 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
益莱储中国5 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
紧跟先前的步伐6 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
benchmark_cc6 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu6 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO6 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析
大文说跨境7 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
CoderYanger7 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
估值探索者7 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口