博客
关于我
Lock锁精讲
阅读量:791 次
发布时间:2023-02-06

本文共 1552 字,大约阅读时间需要 5 分钟。

Lock锁精讲

1.为什么需要Lock

Lock和synchronized这两个锁都能实现线程安全,但功能上有很大不同。Lock并不是synchronized的替代品,而是提供了更高级的功能,适用于特定场景。

以下是为什么synchronized不够用以及Lock的优势:

1.1为什么synchronized不够用

效率低:synchronized的锁定释放较为简单,无法设置超时,且无法中断正在等待锁定的线程。

不够灵活:加锁和释放时单一,难以支持复杂的条件和多次锁定。

无法知道是否成功获取锁:无法判断锁定是否成功,增加了调试难度。

2.Lock锁的意义

Lock提供了比synchronized更高级的锁操作功能,支持多个Condition对象和更灵活的锁定策略。Lock允许一次只能有一个线程获取锁,但某些实现如ReadWriteLock支持并发访问。

与synchronized的主要区别在于Lock的加锁和释放可以不以块结构形式出现,支持在不同范围内手动管理锁定状态。这使得Lock在复杂的多线程算法中非常有用,例如遍历式数据结构的“移交”操作。

Lock的实现必须遵循Java语言规范中关于内存同步的要求,成功锁定和解锁操作必须具有相同的内存同步效果。未成功的锁定和解锁操作则无需同步效果。

3.锁的用法

使用Lock时需要注意以下几点:

1. Lock对象必须在finally块中释放锁,确保锁定在异常时仍能正确解除。

2. Lock实现提供了可中断、可等待和带超时的锁定方式,开发者应根据需求选择合适的方法。

3. Lock实例可以用作synchronized语句中的目标,但获取Lock实例的监视器锁与调用该实例的lock方法无关。建议不混淆两者使用。

4.锁的分类

根据不同的特性,Lock可以被分类为以下几种类型:

4.1悲观锁与乐观锁

悲观锁:线程获取锁后,其他线程必须等待,直到锁被释放。优点是一劳永逸,缺点是可能导致死锁和性能瓶颈。

乐观锁:线程在修改数据前检查数据一致性,若数据已被修改则放弃修改并释放锁。适合读多写少的场景,性能较高。

4.2共享锁与排他锁

共享锁:允许多个线程同时读取数据,但排他性写入不允许。例如ReadWriteLock的读锁。

排他锁:只允许一个线程获取锁,其他线程必须等待。例如ReadWriteLock的写锁。

4.3公平锁与非公平锁

公平锁:线程按照请求顺序获取锁,避免了插队现象,适合对线程公平性有要求的场景。

非公平锁:允许线程插队获取锁,提升吞吐量,但可能导致线程饥饿问题。

4.4可重入锁与不可重入锁

可重入锁:允许同一线程多次获取锁,例如ReentrantLock。

不可重入锁:同一线程只能获取一次锁,避免死锁情况。

4.5自旋锁与阻塞锁

自旋锁:线程在未获取锁时进入循环尝试获取锁,减少等待时间,适合多核环境。

阻塞锁:线程在获取锁时进入等待状态,直到锁被释放。

5.锁优化

在实际应用中,可以通过以下方式优化锁使用:

5.1虚拟机优化:

自旋锁、锁消除和锁粗化是Java虚拟机常用的锁优化技术,提升性能和减少锁 contention。

5.2代码层面优化:

1. 尽量缩小同步代码块。

2. 避免不必要的锁请求,减少锁的竞争。

3. 避免在锁块内再次请求锁,减少死锁风险。

4. 选择适合的锁类型和工具类,例如使用ConcurrentHashMap而不是 synchronized集合进行并发操作。

总结

Lock锁提供了比synchronized更高级的功能,如可中断锁定、超时控制和Condition条件等,适用于更复杂的多线程场景。正确使用Lock需要注意锁定和解锁的管理,以及性能优化的建议,以确保高效和线程安全。

转载地址:http://xbufk.baihongyu.com/

你可能感兴趣的文章
linux查看端口占用情况
查看>>
Linux查看系统中用户信息,Linux下用于查看系统当前登录用户信息的4种方法
查看>>
linux查看远程文件,linux下远程自动查看日志
查看>>
linux根文件系统 /etc/resolv.conf 文件详解
查看>>
Linux根文件系统详解
查看>>
linux每日一练:Enable multithreading to use std::thread: Operation not permitted问题解决
查看>>
linux版本石器时代,石器时代私服架设教程Linux版
查看>>
linux环境下的各种后台执行
查看>>
Linux环境变量的执行顺序
查看>>
Linux用户与用户组的操作
查看>>
linux用户管理:添加用户、设置密码、修改删除
查看>>
Linux的inode的理解
查看>>
Linux的使用总结(二)
查看>>
Linux的压缩包命令
查看>>
Linux的基础命令, django的安装与使用
查看>>
linux的用户管理
查看>>
Linux的目录结构及ls命令介绍
查看>>
Linux目录结构简析
查看>>
linux相关log日志按文件大小进行切割
查看>>
Linux磁盘IO状态分析实战
查看>>