`
sunlong
  • 浏览: 85569 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

死锁的演示

    博客分类:
  • Java
 
阅读更多
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 第一个线程获取local锁后,偿试获取other锁,如果失败,则等待5秒重试
 * 同样第二个线程获取other锁后,偿试获取local锁,如果失败,则放弃等待5秒重试
 * User: sunlong
 * Date: 13-10-18
 * Time: 下午5:10
 */
public class DeadLock {
    public static void main(String[] args){
        final Update a = new Update("this is a");
        final Update b = new Update("this is b");

        final App2 local = new App2("app1");
        final App2 other = new App2("app2");

        new Thread(new Runnable() {
            @Override
            public void run() {
                local.update(a, other);
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                other.update(b, local);
            }
        }).start();
    }

}

class Update{
    private String text;
    public Update(String text){
        this.text = text;
    }

    public String getText(){
        return this.text;
    }
}

/**
 * 这个是传统的syschronized方式演示死锁
 */
class App{
    private final String indent;

    public App(String indent){
        this.indent = indent;
    }

    public synchronized void update(Update update, App backup){
        System.out.println(indent + ": recvd:" + update.getText() + "; backup:" + backup.getIndent());
        /*try{
            TimeUnit.SECONDS.sleep(5);
        }catch (Exception e){

        }*/

        backup.confirmUpdate(this, update);
    }

    private synchronized void confirmUpdate(App backup, Update update){
        System.out.println(indent + ": recvd:" + update.getText() + "; backup:" + backup.getIndent());
    }

    String getIndent() {
        return indent;
    }
}

/**
 * 用lock重写
 */
class App2{
    private final String indent;

    private final ReentrantLock lock = new ReentrantLock();

    public App2(String indent){
        this.indent = indent;
    }

    public void update(Update update, App2 backup){
        boolean acquired = false;
        boolean done = false;
        while (!done){
            System.out.println("--------------------------------");
            try {
                acquired = lock.tryLock(5, TimeUnit.MILLISECONDS);
                if(acquired){
                    System.out.println(indent + ": recvd:" + update.getText() + "; backup:" + backup.getIndent());
                    done = backup.confirmUpdate(this, update);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if(acquired){
                    lock.unlock();
                }
            }

            if(!done){
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private boolean confirmUpdate(App2 backup, Update update){
        boolean acquired = false;

        try{
            acquired = lock.tryLock(5, TimeUnit.MILLISECONDS);
            if(acquired){
                System.out.println(indent + ": recvd confirmed:" + update.getText() + "; backup:" + backup.getIndent());
                return true;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if(acquired){
                lock.unlock();
            }
        }
        return false;
    }

    String getIndent() {
        return indent;
    }
}

 

分享到:
评论

相关推荐

    非常经典的死锁演示代码

    ### 死锁经典演示代码分析 #### 一、死锁概念 死锁是多线程编程中的一个常见问题,指的是两个或多个线程在执行过程中因争夺资源而造成的一种僵局,各线程都无法继续执行下去的情况。在本篇文章中,我们将通过一个...

    银行家算法 死锁演示

    银行家算法是操作系统中一种经典的死锁预防策略,由艾兹格·迪杰斯特拉在1965年提出。这个算法主要用于确保系统的资源分配不会导致系统进入死锁状态,从而保证系统的安全性。死锁是指两个或多个并发进程在执行过程中...

    【IT十八掌徐培成】Java基础第09天-01.多线程-时间片-死锁演示.zip

    今天我们将深入探讨Java中的多线程、时间片调度以及死锁的概念,这些都是Java程序员必备的知识点。 首先,让我们来理解什么是多线程。在单线程程序中,执行流程是线性的,一次只能处理一个任务。然而,多线程允许...

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

    (1)请设计一个程序演示死锁避免算法(银行家算法)。 (2)要求该演示程序可以指定任意的进程数量、资源种类、每种资源总数量(大于等于1)、已分配数量、最大需求数量,同时也可以随机生成上述数值进行模拟(随机...

    多线程死锁

    明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。

    105-演示文稿-死锁检测和恢复.pdf

    标题“105-演示文稿-死锁检测和恢复.pdf”表明本文档是关于计算机操作系统中处理死锁问题的一个演示文稿,主要内容聚焦于死锁的检测方法和在死锁发生时如何恢复系统正常运行的策略。 描述中提到的死锁检测和恢复是...

    操作系统课程设计--死锁

    在操作系统课程设计中,可以通过模拟多进程环境,设计不同的资源分配策略,例如,设置资源分配优先级、设置资源预留机制等,以演示和理解死锁的发生、预防和解决。 七、死锁的实战分析 通过对“死锁”文件的深入...

    101-演示文稿-死锁的概念.pdf

    死锁是并发系统中一种特定的资源竞争状态,当两个或多个进程因争夺资源而互相等待对方释放资源时,如果没有外力干预,那么这些进程都将无法向前推进,这种现象称为死锁。 死锁问题的定义可以理解为一组被阻塞的进程...

    103-演示文稿-死锁预防.pdf

    本文档《103-演示文稿-死锁预防.pdf》主要介绍了死锁预防的几种策略,这些策略分别针对死锁产生的四个必要条件来防止它们同时成立。 首先,死锁产生的四个必要条件是: 1. 互斥条件(Mutual Exclusion):至少有一...

    104-演示文稿-死锁避免.pdf

    死锁是计算机系统中一种严重的问题,特别是在多进程并发运行的环境中。死锁是指两个或多个进程相互等待对方释放资源,导致它们都无法继续执行的状态。本文主要探讨的是死锁的避免策略,特别是通过提前获取系统资源...

    produceconsumer_QWaitCondition_QSemaphore_死锁_

    在提供的文件 "produceconsumer" 中,可能包含了示例代码,演示了如何使用 `QWaitCondition` 和 `QSemaphore` 来实现生产者消费者模型,并模拟死锁情况。通过分析和理解这个示例,你可以更好地理解这些工具的使用...

    102-演示文稿-死锁的必要条件.pdf

    操作系统中的死锁是一个重要的概念,尤其对于理解和设计高效、安全的多进程环境至关重要。死锁是指两个或多个并发进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。以下...

    一个简单的和死锁有关的程序

    本程序通过两个`DeadThread`线程类实例和两个`Test`对象实例演示了死锁(deadlock)现象。死锁是多线程编程中常见的一种问题,发生在多个线程相互等待对方释放资源而无限期阻塞的情况。 在代码中,`DeadThread`继承...

    循环等待 死锁状态.rar_循环列表死锁

    而`classexample 循环等待 死锁状态`可能是包含Java或C++等编程语言编写的类或者示例代码,用于演示如何创建和解决循环等待死锁状态。 要避免死锁,我们可以采取以下策略: 1. 避免循环等待:设计资源的获取顺序,...

    JAVA死锁and生产者消费者问题

    在`ThreadDeadLock.java`文件中,可能包含了演示死锁的代码示例,例如两个线程各自持有对方需要的资源,导致双方都无法继续执行。解决死锁的方法包括避免循环等待、设置优先级、超时重试或者使用死锁检测算法,如...

    死锁环路判定的系统资源分配图约简算法的设计与实现

    GO,顺序执行演示到最后发生死锁或全部解开;资,新建资源的图标,在对话框中输入资源名称和资源个数的并确定后,在窗口任意部分单击鼠标左键,该位置便出现资源的图标(绿色方块),资源数显示为里面的圆,蓝色圆...

    Java源码房门终于被打开了(解决死锁的方法).rar

    在“房门终于被打开了(解决死锁的方法)”这个主题中,可能详细分析了实际案例,演示了如何通过上述策略解决Java死锁问题。通过阅读"说明.txt"和"房门终于被打开了(解决死锁的方法)"这两个文件,我们可以更深入地...

    多线程死锁问题

    `TestDeadLock.java`可能是用来演示死锁的示例。在Java中,我们可以使用`synchronized`关键字来锁定对象,如果两个线程各自持有一个对象的锁,并尝试获取对方持有的锁,就可能导致死锁。例如,线程A持有锁1,尝试...

    操作系统实验源代码(创建进程、信号量、死锁和饥饿)

    源代码可能会演示如何模拟和防止饥饿现象。 这个压缩包的源代码提供了深入理解操作系统核心概念的实践经验,对于学习操作系统原理、调试并发问题和设计更高效的操作系统组件都非常有价值。通过阅读和分析这些代码,...

Global site tag (gtag.js) - Google Analytics