重入锁死

2024-06-04 06:18
文章标签 锁死

本文主要是介绍重入锁死,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接 作者:Jakob Jenkov 译者:刘晓日 校对:丁一

重入锁死与死锁嵌套管程锁死非常相似。Java中的锁Java中的读/写锁两篇文章中都有涉及到重入锁死的问题。

当一个线程重新获取Java中的锁Java中的读/写锁或其他不可重入的同步器时,就可能发生重入锁死。可重入的意思是线程可以重复获得它已经持有的锁。Java的synchronized块是可重入的。因此下面的代码是没问题的:

(译者注:这里提到的锁都是指的不可重入的锁实现,并不是Java类库中的Lock与ReadWriteLock类)

1 public class Reentrant{
2     public synchronized outer(){
3         inner();
4     }
5  
6     public synchronized inner(){
7         //do something
8     }
9 }

注意outer()和inner()都声明为synchronized,这在Java中这相当于synchronized(this)块(译者注:这里两个方法是实例方法,synchronized的实例方法相当于在this上加锁,如果是static方法,则不然,更多阅读:哪个对象才是锁?)。如果某个线程调用了outer(),outer()中的inner()调用是没问题的,因为两个方法都是在同一个管程对象(即this)上同步的。如果一个线程持有某个管程对象上的锁,那么它就有权访问所有在该管程对象上同步的块。这就叫可重入。若线程已经持有锁,那么它就可以重复访问所有使用该锁的代码块。

下面这个锁的实现是不可重入的:

01 public class Lock{
02     private boolean isLocked = false;
03     public synchronized void lock()
04         throws InterruptedException{
05         while(isLocked){
06             wait();
07         }
08         isLocked = true;
09     }
10  
11     public synchronized void unlock(){
12         isLocked = false;
13         notify();
14     }
15 }

如果一个线程在两次调用lock()间没有调用unlock()方法,那么第二次调用lock()就会被阻塞,这就出现了重入锁死。

避免重入锁死有两个选择:

  1. 编写代码时避免再次获取已经持有的锁
  2. 使用可重入锁

至于哪个选择最适合你的项目,得视具体情况而定。可重入锁通常没有不可重入锁那么好的表现,而且实现起来复杂,但这些情况在你的项目中也许算不上什么问题。无论你的项目用锁来实现方便还是不用锁方便,可重入特性都需要根据具体问题具体分析。

(全文完)

这篇关于重入锁死的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029291

相关文章

Java-互斥锁死锁释放锁

互斥锁         互斥锁(Mutex Lock)是一种同步机制,用于确保在任何时刻只有一个线程可以访问特定的代码段(临界区),从而防止数据竞争和不一致性。 使用方法: 在Java中,可以使用synchronized关键字或ReentrantLock类来实现互斥锁。使用lock()方法获取锁,使用unlock()方法释放锁。 特点: 确保线程安全,防止多个线程同时访问共享资源。简单易

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间姿态。但是,当其中两个旋转轴重合时,就会导致万向节锁死(Gimbal Lock)的发生。 具

Mysql间隙锁死锁避免最佳实践

最近写代码的时候听说,批量操作提高死锁的概率,但是心里又想,为什么没看到任何一款数据库相关的中间价禁止或者提醒批量操作?心里想肯定是因为一起其他操作的不当导致的死锁问题。进行了一些思考,希望可以帮助到大家 Mysql死锁的根本原因 死锁诞生的四个必要条件,这个是理论的基础,这个就不讲了,看下最常见也是开发中最容易导致的死锁问题。 很多大厂为了提高性能,会把RR隔离级别改为RC隔离级别,取消了

游戏上线日程序员锁死服务器是怎么回事

程序员锁死服务器导致什么后果?程序员为什么要锁死网站服务器?近日深圳某互联网游戏公司程序员燕某在游戏上线测试当天锁死服务器与电脑,并恶意失踪,致公司损失惨重的事在网上曝光并引起热议。现在该公司已解散,老板自己背了几百万债在打工。程序员燕某为什么要做这么过分的事,与公司有什么仇?他会受到什么处罚,接下来我们详细了解一下! 程序员锁死服务器导致什么后果? 1月20日,深圳市螃蟹网络科技有限公司创

mysql数据库表锁死挂起处理办法

MySql数据库修改表结构或加字段的时候,容易导致表锁死挂起,可以在MySql workbench页面通过下面几条简单的语句: 1.检查被占用的表: show OPEN TABLES where In_use > 0; 2.显示进程: show processlist; 3.杀死挂起的进程即导致表锁死的进程: kill 17909;---17909是进程的id

Linux系统编程_课时82_互斥锁死锁

课时82_互斥锁死锁 文章目录 课时82_互斥锁死锁1、造成死锁的原因1.1、自己锁自己1.2、线程间互锁 1、造成死锁的原因 1.1、自己锁自己 在锁还没有解锁时,再次加锁。 //子线程pthid_p1,操作全局变量numbervoid* pthid_p1_func(void* arg){for(int i=0;i<COUNT_MAX;++i){pthread_m

一个人被锁死在公司底层的根本原因

一、现代社会对员工角色的认知 随着经济全球化和科技进步,现代社会对员工的认知发生了深刻的变化。传统上,员工被视为公司的执行者和生产者,承担着重复性、机械性的工作。然而,随着知识经济和服务型经济的兴起,员工角色逐渐从“执行者”转变为“创造者”和“合作者”。员工被期望具备创新意识、团队合作能力和问题解决能力,而不仅仅是机械地执行任务。这种认知变化影响了员工在企业中的地位和发展前景。 二、公司底

mysql检测是否存在长连接,导致mysql卡住,锁死

-- 超过60秒sql SELECT id,`USER`,`host`,DB,command,`time`,state,info FROM information_schema.PROCESSLIST WHERE TIME>=60;  或者 SELECT id,`USER`,`host`,DB,command,`time`,state,info FROM information_schema.P

21.线程的活性故障:锁死

目录 1.定义2.信号丢失锁死3.嵌套监视器锁死 1.定义 等待线程由于唤醒其所需的条件永远无法成立,或者其他线程无法唤醒这个线程而一直处于非运行状态(线程并未终止)导致其任务 一直无法进展,那么我们就称这个线程被锁死。 2.信号丢失锁死 信号丢失锁死是由于没有相应的通知线程来唤醒 等 待线程而使等待线程一直处于等待状态的一种活性故障 。信号丢失锁死的一个典型例子是等待线程在

乐观锁悲观锁共享锁、排它锁行锁表锁死锁概念的理解

原文:https://www.souyunku.com/2018/07/30/mysql 如果侵犯您的权益请告知删除 MySQL/InnoDB的加锁,一直是一个面试中常问的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等。于是今天就对这几个概念进行学习,屡屡思路,记录一下。 注:MySQL是一个支持插件式存储引