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

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

正文


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

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

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

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

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

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

相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-概述以及全局锁(介绍、语法、特点)
MySQL数据库——锁-概述以及全局锁(介绍、语法、特点)
87 0
|
6月前
|
安全 算法 Java
Java多线程基础-15:Java 中 synchronized 的优化操作 -- 锁升级、锁消除、锁粗化
`synchronized`在Java并发编程中具有以下特性:开始时是乐观锁,竞争激烈时转为悲观锁;从轻量级锁升级至重量级锁;常使用自旋锁策略;是不公平且可重入的;不支持读写锁。
53 0
|
6月前
|
安全 Python
在Python中,如何使用锁和条件变量来确保代码片段是线程安全的?
在Python中,如何使用锁和条件变量来确保代码片段是线程安全的?
50 0
|
6月前
|
安全 编译器 Linux
多线程(进阶一:锁策略)
多线程(进阶一:锁策略)
164 0
|
6月前
|
Java
多线程并发之显示锁Lock与其通信方式Condition源码解读
多线程并发之显示锁Lock与其通信方式Condition源码解读
47 0
|
11月前
|
Linux C语言
一个简单案例理解为什么在多线程的应用中要使用锁
一个简单案例理解为什么在多线程的应用中要使用锁
38 0
|
安全 Java 编译器
【JavaEE】多线程进阶问题-锁策略and死锁,CAS操作,Synchronized原理
JavaEE & 多线程进阶问题 & 锁策略and 死锁,CAS操作,Synchronized原理
59 0
|
Java 测试技术
高并发编程-自定义带有超时功能的锁
高并发编程-自定义带有超时功能的锁
67 0
|
关系型数据库 中间件 MySQL
上手全局锁,死锁
上手全局锁,死锁
上手全局锁,死锁
|
存储 安全 Java