`

死锁实例

阅读更多

下面这道题,是考死锁的,比较简单,想两个问题:

1.什么时候会造成死锁

2.wait和notify释放了哪个锁,因为题目中有两个锁。

 

import java.util.LinkedList;


public class DeadLockTest {
    LinkedList list = new LinkedList();  
      
    public synchronized void push(Object x) {  
        System.out.println("push");
        synchronized (list) {  
            list.addLast(x);  
            notify();  
        }  
    }  
 
    public synchronized Object pop() throws Exception {    
        synchronized (list) {  
            if (list.size() <= 0) {  
                wait();  
            }  
            return list.removeLast();  
        }  
    }  
    
    public static void main(String[] args) throws InterruptedException {
        final DeadLockTest deadLockTest = new DeadLockTest();
        Thread thread = new Thread(new Runnable() {
            public void run() {
                try {
                    deadLockTest.pop();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        Thread.sleep(2000);
        Thread threadPush = new Thread(new Runnable() {
            public void run() {
                try {
                    deadLockTest.push("push thread");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        threadPush.start();
        
    }
}

 

显然当stack中没有元素时,pop的时候会释放this对象锁,当其它线程进行push或者pop时,list并没有释放,一直等待list的释放,但是wait又在等待其它线程唤醒,因此出现了死锁。

 

分享到:
评论
2 楼 smyz371 2013-01-18  
首先要分清持有谁的锁,释放了谁的锁,pop释放了this的锁,持有了list这个对象的锁。
所以push才能进入,但是无法notify,因为没有持有list对象的锁。
1 楼 uule 2012-05-23  
应该是当List为空时,pop的锁一直wait,需要唤醒,而push也获取不到List的锁,进而无法执行notify唤醒方法,所以死锁。

相关推荐

    java线程死锁实例

    Java线程死锁是多线程编程中一个常见的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。死锁的发生通常涉及到四个必要条件:互斥、请求与保持、不剥夺和循环等待。理解并解决Java...

    Java线程死锁实例及解决方法

    Java线程死锁实例及解决方法 Java线程死锁是一种特殊的线程状态,发生死锁时,多个线程会相互等待,无法继续执行,直到外部干预。下面是Java线程死锁实例及解决方法的详细介绍。 一、死锁的定义 所谓死锁是指多个...

    C例子:死锁too

    该程序是我写的博客“一起talk C栗子吧((第一百一十九回:C语言实例--线程死锁三)”的配套程序,共享给大家使用

    C#中lock死锁实例教程

    如果两个不同的线程分别锁定类型的不同实例,然后尝试获取对方锁定的实例,就会产生死锁。比如,线程1持有int类型的锁,线程2持有float类型的锁,它们都在等待对方的锁,造成死锁。 3. **字符串问题**: 在C#中,...

    通过Android trace文件分析死锁ANR实例过程

    本文将通过一个具体的死锁导致的ANR实例,解析如何利用Android trace文件来分析和解决这类问题。 当Android系统检测到ANR发生时,会在/data/anr/目录下自动生成一个trace文件,其中包含了系统运行时的详细信息,如...

    iOS中的线程死锁实例详解

    什么是线程死锁 是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 线程死锁怎么发生 发生死锁的情况一般是两个对象的锁相互等待造成的。 死锁...

    MySQL数据库的一次死锁实例分析

    本文将通过一个具体的实例来深入理解MySQL死锁的产生、检测以及解决策略。 首先,让我们回顾一下这个实例。在2016年11月15日,一个生产环境的bug引发了死锁。业务操作包括从表`test1`归档数据到历史表`test2`,同时...

    ch7 死锁.ppt

    【死锁实例分析】 1. **进程推进顺序不当**:当进程按照特定顺序请求资源时,可能导致彼此等待对方释放资源,形成循环等待,如例子中进程P和Q对打印机和读卡机的请求。 2. **PV操作不当**:在使用信号量(如P、V...

    操作系统第五次作业死锁.pdf

    4. 死锁实例分析: - **带闸门运河的吊桥问题**:如果驳船长度等于两座桥之间的距离,可能会导致死锁,因为驳船的船头和船尾分别占据两座桥,而汽车可能在两者之间被阻塞,形成环路等待。 - **避免死锁**:可以...

    Visual.C#.编程精彩百例

    实例46 防止多线程应用程序死锁 实例47 文件同步操作与应用 实例48 在COM程序设计中使用.NET组件 实例49 文件异步操作与多处理器系统 实例50 获取网络主机IP地址 实例51 C#对话信息框的应用 实例52 在C#中快速...

    java 多线程死锁详解及简单实例

    以下是几种常见的死锁实例: 1. **忘记释放锁**:如果线程在执行过程中遇到错误,没有正常执行`LeaveCriticalSection()`,导致资源无法释放,其他等待该资源的线程将陷入死锁。 2. **单线程重复申请锁**:当一个...

    WM_计算机操作系统习题及答案5.pdf

    7. **死锁实例分析**: - 当资源数量少于进程所需资源的总和,或者进程按照特定顺序申请资源时,可能发生死锁。 - 在某些情况下,如资源数为4,进程数为3,每个进程需要2个资源,如果每个进程都已获得1个资源,...

    哲学家问题的模拟实现

    哲学家进餐问题就是一个典型的死锁实例。 3. **资源分配图**:在分析死锁时,可以使用资源分配图来表示进程与资源之间的关系。在这个问题中,哲学家是进程,筷子是资源。 4. **预防死锁**:一种策略是确保系统不会...

    一次mysql死锁的排查过程

    **死锁实例** 在5.5版本的MySQL数据库中,使用了默认的Repeatable-Read隔离级别和InnoDB引擎。有一个名为`test`的表,包含一个主键`id`和一个唯一索引`a`。当执行如下操作时,发生了死锁: 1. 事务1尝试删除`a`为2...

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

    以下是一个简单的死锁实例: ```java public class DeadLock implements Runnable { public int flag = 1; private Object o1 = new Object(); private Object o2 = new Object(); public DeadLock(int flag) ...

Global site tag (gtag.js) - Google Analytics