美文网首页
一个死锁的例子

一个死锁的例子

作者: Bejamin | 来源:发表于2017-07-30 20:03 被阅读285次

先举个栗子。

/**
 * Created by Benjamin on 07/30/030.
 */
public class TestDeadLock implements Runnable {
    public int    flag = 1;
    static Object o1   = new Object(), o2 = new Object();

    @Override
    public void run() {
        System.out.println("flag = " + flag);
        if (flag==1){
            synchronized (o1) {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("1");
                }
            }
        }

        if (flag==0){
            synchronized (o2){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("0");
                }
            }
        }
    }

    public static void main(String[] args) {
        TestDeadLock t1 = new TestDeadLock();
        TestDeadLock t2 = new TestDeadLock();
        t1.flag = 1;
        t2.flag = 0;
        new Thread(t1).start();
        new Thread(t2).start();
    }
}
产生死锁的原因主要是:
  • 系统资源不足
  • 资源分配不当
  • 推进顺序不合适
产生死锁的四个必要条件:
  • 互斥:一个资源每次只能被一个进程使用
  • 资源保持:一个进程被阻塞时,不释放已有资源
  • 不可抢占:正在使用的资源不能被剥夺
  • 循环等待:循环等待未被分配的资源
例子死锁的原因:

静态对象o1和o2是类的资源。当flag=1的线程请求到o1资源时,再申请资源o2时,o2资源已经被flag=0的线程占有,并且后者需要申请资源o1才能继续执行。这样,二者就形成了相互等待的情形,故而形成死锁。

相关文章

  • 关于向主线程添加同步任务造成死锁的思考

    有这样一个例子,即在主线程开启同步任务死锁的例子: 关于这个例子如何会死锁,网上也有很详细的解释。不过可能对于某些...

  • Java并发之嵌套管程锁死(Nested Monitor Loc

    嵌套管程死锁是如何发生的 具体的嵌套管程死锁的例子 嵌套管程死锁 vs 死锁 嵌套管程锁死类似于死锁, 下面是一个...

  • 一个死锁的例子

    先举个栗子。 产生死锁的原因主要是: 系统资源不足 资源分配不当 推进顺序不合适 产生死锁的四个必要条件: 互斥:...

  • Java死锁例子

  • 死锁

    死锁四个条件: 死锁例子: 解读上述代码: 1.synchronized 就是满足死锁条件----互斥条件----...

  • iOS 多线程面试题(死锁)

    死锁 死锁就是队列引起的循环等待 1、一个比较常见的死锁例子:主队列同步 在主线程中运用主队列同步,也就是把任务放...

  • 死锁理论知识补充

    目录 1.死锁的定义与例子2.死锁的原因3.破题 定义: 死锁的一个比较专业的定义是:一组互相竞争资源的线程因互相...

  • Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁。 代码如下:Program.java...

  • [Java]一个DeadLock(死锁)的例子

    今天在InteliJ里跑了一下,模拟了一个死锁。synchronized关键字修饰的方法可能会导致死锁。(Sync...

  • go语言 从一个进程死锁分析pipe的缓冲功能

    从一个进程死锁分析pipe的缓冲功能 背景介绍 最近碰到一个进程死锁的例子,这个进程简化后主要功能是: 调用一个s...

网友评论

      本文标题:一个死锁的例子

      本文链接:https://www.haomeiwen.com/subject/daeklxtx.html