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

小结

相关推荐
Am心若依旧40922 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生25 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
Yan.love31 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶34 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥34 分钟前
java提高正则处理效率
java·开发语言
VBA633744 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~1 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring