你真的知道如何使用锁吗?

简介: 你真的知道如何使用锁吗?

正文


“锁”这个字在平时的生活中,频繁的出现在周围的生活中。在代码的世界里,锁的种类很多,比如:共享锁、排他锁、读写锁、行锁、表锁、间隙锁、next-key锁、记录锁、可重入锁等等等。当然上面的所说的种类分布于各个技术中。今天,一起来聊一聊显式锁隐式锁

在Java体系中,显式锁隐式锁。分别是由ReentrantLock与synchronized这两个组件来展现的。显式锁:手动的加锁以及解锁。隐式锁,JVM层面自动的加锁以及解除锁。

synchronized(隐式锁)底层是由monitorenter和monitorexit实现的。JVM 自动的帮助实现对于共享代码区域的访问读写。ReentrantLock(式锁)我们需要手动的加锁以及解锁。

所以使用锁选择的规则是可以分为2个纬度的。

第一个纬度就是对于Java语言的熟练程度,当不熟悉Java语言的运行机制,这个时候,选择synchronized是一个比较好的选择,避免了一些忘记的操作。ReentrantLock他是手动的,会忘记解锁,这个时候,其他的线程就会无限的等待。

第二个纬度就是根据业务来进行选择。当我们的业务属于高并发,大规模的请求的时候,如果使用synchronized会产生请求线程堆积的问题,如果一个业务的处理时间比较长的话,就会出现服务不可用、响应慢的情况,在严重就是服务直接挂掉。这个问题是非常严重的问题。这个时候,应当选择ReentrantLock,他足够的灵活,他给我们提供了一个有效的方法可以在有限的时间内查看是否自己获取到锁的信息,如果不能获取到,那么就会直接抛出异常,采用兜底服务处理。这就保证了防止请求的线程堆积造成严重的后果。所以,选择一个合适的锁,对于我们业务是十分重要的。要根据具体的环境选择合适的。

相关文章
|
1月前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
【4月更文挑战第6天】`ReentrantLock`是Java并发编程中一个强大的同步工具,比`synchronized`提供更丰富功能。它支持可响应性、可中断性、公平性选择及条件变量。通过示例展示了创建、公平性设置、可中断锁定、尝试锁定及条件变量的使用。`ReentrantLock`使线程同步更灵活,适用于高性能应用,但使用需谨慎,理解其原理并恰当使用。
|
3月前
|
安全 Python
在Python中,如何使用锁和条件变量来确保代码片段是线程安全的?
在Python中,如何使用锁和条件变量来确保代码片段是线程安全的?
23 0
|
3月前
|
安全 编译器 Linux
多线程(进阶一:锁策略)
多线程(进阶一:锁策略)
130 0
|
5月前
|
Java
多线程并发之显示锁Lock与其通信方式Condition源码解读
多线程并发之显示锁Lock与其通信方式Condition源码解读
23 0
|
5月前
|
Linux C语言
一个简单案例理解为什么在多线程的应用中要使用锁
一个简单案例理解为什么在多线程的应用中要使用锁
18 0
|
7月前
|
供应链 数据库
关于乐观锁上锁成功的前提条件讨论
关于乐观锁上锁成功的前提条件讨论
53 0
|
10月前
|
缓存 Linux 容器
深入了解锁细节
深入了解锁细节
43 0
|
11月前
|
存储 安全 Java
08.从源码揭秘偏向锁的升级
大家好,我是王有志。上一篇学习了synchronized的用法,今天我们深到synchronized的原理,来学习偏向锁升级到轻量级锁的过程。
122 0
08.从源码揭秘偏向锁的升级
|
关系型数据库 中间件 MySQL
上手全局锁,死锁
上手全局锁,死锁
上手全局锁,死锁
|
存储 Java 对象存储