Java 并发编程不可不知的七种锁类型与注意事项


prtyaa
prtyaa 2023-12-30 21:33:43 64178 赞同 0 反对 0
分类: 资源
锁是解决并发冲突的重要工具。在开发中我们会用到很多类型的锁,每种锁都有其自身的特点和适用范围。 需要深刻理解锁的理念和区别,才能正确、合理地使用锁。

常用锁类型

乐观锁与悲观锁

悲观锁对并发冲突持悲观态度,先取锁后访问数据,能够较大程度确保数据安全性。

而乐观锁认为数据冲突的概率比较低,可以尽可能多地访问数据,只有在最终提交数据进行持久化时才获取锁。

 

悲观锁总是先获取锁,会增加很多额外的开销,也增加了死锁的几率。尤其是对于读操作,不会修改数据,使用悲观锁大大增加系统的响应时间。

乐观锁最后一步才提交数据,死锁的几率比较低,但是如果有多个事务同时处理相同数据也有几率会冲突甚至导致系统异常。

 

传统关系型数据库常常使用悲观锁,以提高数据安全性。使用乐观锁的场景,通常用版本号来确保数据安全。

 

自旋锁

自旋锁会让处于等待状态的线程执行空循环一段时间,执行完空循环后如果能够获取锁就立即获取锁,否则才挂起线程。

使用自旋锁,能够降低等待线程被挂起的概率。线程进入阻塞状态再次唤醒,需要在用户态和内核态之间进行切换,自旋锁避免了进入内核态,因此有比较好的性能。

 

自旋锁适用于竞争不激烈且线程任务执行时间短的场景。但是对于竞争激烈或者任务执行时间长的场景,不适合使用自旋锁,否则会浪费 CPU 时间片。

 

重入锁

Java 中提供的可重入锁 ReentrantLock,是一种递归无阻塞的同步机制,可以在外层方法已经加锁的情况下,让内层方法再次获取锁。

ReentrantLock 维护了一个计数器,每加锁一次计数器加一,解锁一次计数器减一。Java 中的 synchronized 也是一种可重入锁。

 

轮询锁与定时锁

轮询锁是通过线程不断尝试获取锁来实现的,可以避免发生死锁,可以更好地处理错误场景。Java 中可以通过调用锁的 tryLock 方法来进行轮询。tryLock 方法还提供了一种支持定时的实现,可以通过参数指定获取锁的等待时间。如果可以立即获取锁那就立即返回,否则等待一段时间后返回。

 

读写锁

读写锁 ReadWriteLock 可以优雅地实现对资源的访问控制,具体实现为 ReentrantReadWriteLock。读写锁提供了读锁和写锁两把锁,在读数据时使用读锁,在写数据时使用写锁。

 

读写锁允许有多个读操作同时进行,但只允许有一个写操作执行。如果写锁没有加锁,则读锁不会阻塞,否则需要等待写入完成。

 

```java
ReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
```

 

锁的使用

减小锁的范围

加锁后可以确保一个方法或一段代码只有一个线程访问,因此锁定范围要尽可能小。比如使用 synchronized 时,能对代码块进行加锁,就尽量不要对方法进行加锁。

 

对象锁与类锁

能锁对象,就不要锁定类,尽量控制范围。锁定类以后,所有的线程使用同一把锁,同一时刻只有一个线程可以加锁;而锁定对象,可以增加锁的数量,提高并发的效率。

 

锁的公平性

大部分锁都支持设置公平性:公平锁是指按照线程等待的时间来决定哪个线程先获取锁,非公平锁是指随机选择一个线程来获取锁。重入锁和读写锁默认都是非公平锁,也可以通过参数来设置。使用时需要根据具体场景来决定设置公平或非公平。

 

锁消除

如无必要,不要使用锁。Java 虚拟机也可以根据逃逸分析判断出加锁的代码是否线程安全,如果确认线程安全虚拟机会进行锁消除提高效率。

 

锁粗化

如果一段代码需要使用多个锁,建议使用一把范围更大的锁来提高执行效率。Java 虚拟机也会进行优化,如果发现同一个对象锁有一系列的加锁解锁操作,虚拟机会进行锁粗化来降低锁的耗时。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL3
粉丝 1 资源 1949 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  518
MiSans 阿拉伯语字体文件  462
解决新版本麒麟系统中微信打开白屏显示  402
麒麟系统进行系统监控,查看进程的运行时间来优化性能  334
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  226
统信桌面专业版添加字体  220
统信uos单一程序黑屏,任务栏正常显示解决办法  219
统信uos快捷键文档  190
统信系统双无线网卡设置关闭开启单一网卡  146
分享一个磁盘恢复工具,适用于多平台(包括统信)  124
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!