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

小结

相关推荐
专注VB编程开发20年4 分钟前
csdn手机app应该增加导入word格式markdown格式,或者输入网址自动导入
开发语言
ChineHe7 分钟前
Golang并发编程篇001_并发编程相关概念解释
开发语言·后端·golang
Uluoyu7 分钟前
word、pdf文档内容提取工具类
java·pdf·word
@大迁世界13 分钟前
Promise.all 与 Promise.allSettled:一次取数的小差别,救了我的接口
开发语言·前端·javascript·ecmascript
自由的疯20 分钟前
java 怎么判断事务有无提交成功
java·后端·架构
情深不寿31724 分钟前
C++特殊类的设计
开发语言·c++·单例模式
流星白龙37 分钟前
【Qt】3.认识 Qt Creator 界面
java·开发语言·qt
机灵猫1 小时前
深入理解 Java 类加载与垃圾回收机制:从原理到实践
java·开发语言
weixin_307779131 小时前
AWS Redshift 数据仓库完整配置与自动化管理指南
开发语言·数据仓库·python·云计算·aws