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

小结

相关推荐
曹牧8 分钟前
C#:同一项目中维护多个版本的代码
开发语言·c#
钝挫力PROGRAMER9 分钟前
static final 指向可变集合的设计模式
java·设计模式
青山师10 分钟前
Java反射深度解析:运行时探查的艺术、代价与工程实践
java·开发语言·面试·反射·java程序员·java核心
安当加密12 分钟前
Spring Boot应用接入国产安当凭据管理系统SMS Starter实战(附源码)
java·spring boot·后端
skilllite作者12 分钟前
Deer-Flow 工作流引擎深度评测报告
java·大数据·开发语言·chrome·分布式·架构·rust
likerhood13 分钟前
Java的TimeUnit详细讲解
java·开发语言
2401_8971905515 分钟前
【C++高阶系列】告别内查找局限:基于磁盘 I/O 视角的 B 树深度剖析与 C++ 泛型实现!
java·c++·算法
沐知全栈开发15 分钟前
Lua 数组
开发语言
xyq202416 分钟前
优化堆排序
开发语言
摇滚侠17 分钟前
Java 项目教程《黑马商城》微服务拆分 20 - 22
java·分布式·架构