死锁产生的原因及条件和手写死锁

什么是死锁?

由于两个或者多个线程互相持有对方所需要的资源,导致线程处于等待状态,造成死锁。

为什么会产生死锁(为什么会互相占用对方的资源)

  • 因为系统资源不足。
  • 进程运行推进的顺序不合适。
  • 资源分配不当等。

产生死锁的四个必要条件

互斥条件:一个资源每次只能被一个进程使用。

请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

手写死锁

public class DeadLock {
    public static void main(String[] args) {
        Object object1 = new Object();
        Object object2 = new Object();
        Thread thread1 = new Thread(new FirstThread(object1, object2));
        Thread thread2 = new Thread(new SecondThread(object1, object2));
        thread1.start();
        thread2.start();
    }
}

class FirstThread implements Runnable {
    Object object1;
    Object object2;

    public FirstThread(Object object1, Object object2) {
        this.object1 = object1;
        this.object2 = object2;
    }

    @Override
    public void run() {
        synchronized (object1) {// 获得锁对象1
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            synchronized (object2) {// 获得锁对象2

            }
        }
    }
}

class SecondThread implements Runnable {
    Object object1;
    Object object2;

    public SecondThread(Object object1, Object object2) {
        this.object1 = object1;
        this.object2 = object2;
    }

    @Override
    public void run() {
        synchronized (object2) {// 获得锁对象2
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            synchronized (object1) {// 获得锁对象1

            }
        }
    }
}

原文地址:https://www.cnblogs.com/java-spring/p/10792062.html

时间: 2024-10-30 04:23:49

死锁产生的原因及条件和手写死锁的相关文章

死锁产生的原因和条件简述

深入理解死锁产生的原因和条件,对于日后避免死锁的产生有着非常重要的意义.死锁产生的原因主要是竞争资源,其产生的条件包括资源互斥.请求保持.不能剥夺和循环等待. 死锁产生的根本原因是资源竞争.如果若干个线程正常运行,遇到彼此需要对方占有的资源时,就可能产生线程死锁.如果若干个线程异常运行,资源的请求与释放的顺序不当,也可能产生死锁. 死锁产生的条件包括以下4点: 资源互斥:即资源仅能让一个线程使用而不支持多个线程同时使用. 请求保持:已经拥有资源的线程在请求其他资源时并没有释放当前资源. 不能剥夺

死锁产生的原因、必要条件和场景解析·

死锁是是进程死锁的简称,指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进.它是计算机操作系统乃至并发程序设计中最难处理的问题之一. 举个简单的例子,系统中只有一台CD-ROM驱动器和一台打印机,某一个进程占有了CD-ROM驱动器,又申请打印机:另一进程占有了打印机,还申请CD-ROM.结果,两个进程都被阻塞,永远也不能自行解除.这就是死锁. 产生死锁的主要原因有三点: (一)系统资源不足: (二)进程运行推进的顺序不对: (三)系统

mysql数据库死锁的产生原因及解决办法

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型

死锁产生的原因&&必要条件&&如何避免死锁

产生死锁的原因主要是:(1) 因为系统资源不足.(2) 进程运行推进的顺序不合适.(3) 资源分配不当等.如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁.其次,进程运行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件:死锁的4个必要条件:(1)互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用.(2)请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源.(3)非剥

多线程死锁的产生原因以及如何避免

多线程以改善了系统资源的利用率并且提高了系统的处理能力.但是,并发执行同时也带来了新的问题--死锁.所谓的死锁就是多个线程因竞争资源而造成的一种互相等待,如果没有外力作用,这些线程都将无法继续执行 死锁产生的原因 系统资源的竞争 通常系统中拥有的不可剥夺资源,其数量不足以满足多个线程运行的需要,使得线程在 运行过程中,会因争夺资源而陷入僵局,如磁带机.打印机等.只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的. 线程推进顺序非法 线程在运行过程中,请求和释放资源的顺序

【操作系统-死锁】死锁发生的条件是什么?死锁的避免和预防方法

digest:本文章简要概述操作系统死锁的原因以及预防和解决方法. 1.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种进程间相互阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.                                                                ——汤小丹等.<计算机操作系统>:西安电子科技大学出版社,2012.

什么是死锁?死锁产生的原因?

什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去. 集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的. 举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁.如下图所示: 产生死锁的原因? 1.竞争资源 系统中的资源可以分为两类:一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再

Oracle常见死锁发生的原因以及解决方法

Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. Oracle 10g, PL/SQL version 9.2 CREATE TABLE testLock(  ID NUMBER, test VARCHAR(100)  ) COMMIT INSERT INTO testLock VALUES(1,'test1'); INSERT INTO testLock VAL

CSS失效网页乱码原因兼容问题-手写CSS代码注意什么

我们在写html代码和css 代码应该注意些什么,这节我们讲解大小写与编码问题.(体感音乐) 乱码VS编码前面我们介绍过导致网页乱码.CSS失效等原因一部分是由于自己编写的时候没有注意编码问题,不编码转化问题,常常因为自己写的时候使用一种编码,发现别人比较好的DIV+CSS片段比较好直接就复制过来用,结果别人编码与自己编码不符合从而造成网页在IE中呈现乱码,或CSS失效(CSS声明).解决办法使用软件中编码转化功能进行网页代码转化.如使用Dreamweaver中功能转化编码.-了解语言编码cha