`

错序死锁(Locking-ordering deadlock)

    博客分类:
  • JAVA
阅读更多
错序死锁(Locking-ordering deadlock)是众多死锁情形中的一种,造成这种死锁的主要原因就是某些并发操作需要获取一个锁集合或其子集。

如下面的代码:
import java.util.concurrent.TimeUnit;
public class LockOrderingDeadLock {
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void op1() {
        synchronized(lock1) {
            System.out.println("do sth in op1 with lock1...");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {}
            System.out.println("after sleep in op1");
            synchronized(lock2) {
                System.out.println("do sth in op1 with lock2...");
            }
        }
    }

    public void op2() {
        synchronized(lock2) {
            System.out.println("do sth in op2 with lock2...");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {}
            System.out.println("after sleep in op2");
            synchronized(lock1) {
                System.out.println("do sth in op2 with lock1...");
            }
        }
    }

    public static void main(String... args) {
        final LockOrderingDeadLock test = new LockOrderingDeadLock();
        new Thread() {
            public void run() {
                test.op1();
            }
        }.start();
        new Thread() {
            public void run() {
                test.op2();
            }
        }.start();
    }
}

在op1中,获取锁lock1后做了一些操作,而op2同时获取lock2后进行一些操作,当op1需要lock2的时候,op2尚未释放lock2,而op2一直等待lock1才能完成操作,于是就造成了死锁。示例中的死锁情况比较直观,两个锁是在同一个类中。而实际情况往往比这个复杂且难以发觉,如以下情形:
public void transferMoney(Account fromAccount,
                          Account toAccount,
                          DollarAmount amount)
        throws InsufficientFundsException {
    synchronized (fromAccount) {
        synchronized (toAccount) {
            if (fromAccount.getBalance().compareTo(amount) < 0)
                throw new InsufficientFundsException();
            else {
                fromAccount.debit(amount);
                toAccount.credit(amount);
            }
        }
    }
}

当同时有两个调用:
A: transferMoney(myAccount, yourAccount, 10);
B: transferMoney(yourAccount, myAccount, 20);
A操作需要先个myAccount加锁,后给yourAccount加锁;而B要先给yourAccount加锁,后给myAccount加锁,这又带来了锁顺序问题,而锁的顺序是由外界输入确定的,这种就难以发觉。

解决这类死锁的根本思想就是设法保证多个锁的加锁顺序一致。
分享到:
评论

相关推荐

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...

    死锁1---马克-to-win java视频

    死锁1deadlock---马克-to-win java视频的详细描述与介绍

    死锁2---马克-to-win java视频

    死锁2deadlock---马克-to-win java视频的详细的描述与介绍

    go-deadlock:go (golang) 中的在线死锁检测

    什么go-deadlock 为 sync.(RW)Mutex 提供了 (RW)Mutex 的替代品。 如果您创建频道的意大利面,它将不起作用。 仅互斥体。安装go get github.com/sasha-s/go-deadlock/...用法 import "github....

    locking-selftest-spin.rar_elf

    因为32位程序可能需要访问64位系统的数据结构,这些结构可能在多个线程之间共享,此时自旋锁可以确保在任何时刻只有一个线程能修改这些共享数据,从而避免数据竞争和死锁。 总结起来,"locking-selftest-spin.rar_...

    PyPI 官网下载 | plone.locking-2.0.6.tar.gz

    3. **锁超时**:为了避免因意外情况导致的死锁,Plone.locking设置了锁的超时机制,如果用户在规定时间内未完成编辑,锁将自动释放。 4. **锁状态查看**:用户可以查看当前对象的锁定状态,了解是否可以安全编辑。 5...

    some-hints-on-how-to-encure-deadlock-in-SOA-and-Cloud-Computing

    根据提供的文件信息,本文将对“如何在SOA及云计算环境中预防死锁”这一主题进行深入探讨,并结合《分布式服务导向架构中的死锁避免》这篇硕士论文中的相关内容,阐述死锁的基本概念、产生的原因以及在服务导向架构...

    几种不常见的MySQL InnoDB 死锁情况--1

    然而,即使有了这样的机制,死锁仍然可能发生,尤其是在并发操作复杂的环境中。本篇文章将探讨几种不常见的MySQL InnoDB死锁情况。 一、死锁的概念与产生原因 死锁是指两个或多个事务在执行过程中,因争夺资源而...

    操作系统中避免死锁方法---银行家算法

    其中,死锁问题一直是一个需要解决的核心问题。死锁是指在操作系统中,一组进程由于竞争资源而造成的一种僵局。进程间相互等待对方占用的资源,导致无法向前推进,系统资源无法得到充分的利用,影响了系统的正常运行...

    locking-selftest-spin-softirq.rar_decide

    标题“locking-selftest-spin-softirq.rar_decide”和描述中的“provide all the vectors, so that EQ creation response can decide which one to use”涉及到的是Linux内核中的锁机制、中断处理和设备驱动编程的...

    一个基于C#实现的多线程Multi-Threading Deadlock Tracer Utility处理类库源码

    本资源提供了一个基于C#实现的多线程死锁检测工具——"Multi-Threading Deadlock Tracer Utility"的源代码,它有助于开发者理解和解决多线程环境中常见的死锁问题。 死锁是多线程编程中的一个严重问题,当两个或多...

    PyPI 官网下载 | django-db-locking-2.0.0.tar.gz

    《PyPI官网下载 | django-db-locking-2.0.0.tar.gz——Django数据库锁定机制详解》 在Python的世界中,Django框架是构建Web应用程序的热门选择,其强大的功能和灵活性深受开发者喜爱。然而,随着应用规模的扩大,多...

    一些常见的MySQL死锁案例-mysql-deadlocks-master(源代码+案例+图解说明)

    这个项目收集了一些常见的 MySQL 死锁案例,大多数案例都来源于网络,并对其进行分类汇总,试图通过死锁日志分析出每种死锁的原因,还原出死锁现场。 实际上,我们在定位死锁问题时,不仅应该对死锁日志进行分析,还...

    locking-selftest-spin-hardirq.rar_partition

    `locking-selftest-spin-hardirq.c` 文件名暗示了一个关于锁机制的自我测试,特别是在硬中断(hardirq)上下文中。在嵌入式系统中,硬中断是系统响应外部硬件事件的快速通道,比如网络数据包接收或定时器超时。在硬...

    mysql-一些常见的mysql死锁案例-笔记记录.zip

    然而,随着并发操作的增加,数据库可能会遇到一种特殊的问题——死锁。死锁是指两个或多个事务在等待对方释放资源,从而导致它们都无法继续执行的情况。本文将深入探讨MySQL中的死锁现象,以及如何识别、避免和解决...

    现代操作系统课件:Chapter6-Deadlock.ppt

    Chapter 6 - Deadlock主要探讨了资源管理以及与死锁相关的各种概念。以下是详细的知识点解析: 1. 资源(Resources): - 资源是操作系统中被单个进程在某一时刻独占使用的对象,如设备、文件等。 - 资源可以分为...

    3-进程管理-死锁2-银行家算法实例1

    【银行家算法】是用于预防操作系统中出现死锁的一种策略,由艾兹格·迪杰斯特拉在1965年提出。它基于资源分配和安全性检查,确保系统能够避免死锁的发生。银行家算法的核心思想是模拟银行贷款系统,通过预先分配资源...

    Linux内核调试技术——进程D状态死锁检测-List_linux-亚虎娱乐博客 - 亚虎娱乐1

    《Linux内核调试技术——进程D状态死锁检测》 在Linux操作系统中,进程的状态管理是内核核心功能的一部分,而死锁问题则是系统稳定性和性能的重要考量因素。本文将探讨Linux内核如何通过hung task机制来检测和处理...

    Unreliable Guide to Locking -by Rusty Russell-中文版 .pdf

    《Unreliable Guide to Locking》是一份由Rusty Russell撰写的详尽文档,中文版由albcamus翻译,深入探讨了Linux内核中的锁定机制。这份文档是免费软件的一部分,遵循GNU通用公共许可协议发布,允许用户自由地分发、...

    操作系统课程设计 死锁的避免---银行家算法

    操作系统课程设计死锁的避免---银行家算法 死锁是操作系统中的一种常见问题,它会导致系统性能下降甚至崩溃,因此避免死锁是操作系统设计中的一项重要任务。银行家算法是避免死锁的一种常用方法,本文将对银行家...

Global site tag (gtag.js) - Google Analytics