【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这里就不说了,可以参考之前的博客,本质就是从无锁到偏向锁到轻量级锁到重量级锁。

小结

相关推荐
爱掉发的小李3 分钟前
每日一道算法题
java·开发语言·数据结构·后端·算法·排序算法·动态规划
人才程序员3 分钟前
【PySide6快速入门】ui文件的使用
c语言·开发语言·前端·qt·ui·python3.11·界面
阿龍178711 分钟前
获取metadata耗时对比(libtag/ffmpeg/gstreamer)
开发语言·qt·ffmpeg
蓝田~32 分钟前
java.sql.Date 弃用分析与替代方案
java·microsoft
论迹32 分钟前
【JavaEE】-- 计算机是如何工作的
java·java-ee·dubbo
计算机-秋大田1 小时前
微信外卖小城程序设计与实现(LW+源码+讲解)
java·开发语言·微信·微信小程序·小程序·课程设计
老大白菜1 小时前
使用 Go 和 gqlgen 实现 GraphQL API:实战指南
开发语言·golang·graphql
2301_793069821 小时前
JAVA 接口、抽象类的关系和用处 详细解析
java·开发语言
kerwin_code1 小时前
Sentinel 控制台集成 Nacos 实现规则配置双向同步和持久化存储(提供改造后源码)
java·sentinel
大秦王多鱼1 小时前
【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)
java·开发语言