你不知道什么是死锁?

当两个线程相互等待对象释放同步监视器时就会发生死锁,一旦出现死锁,整个程序既不会发生任何异常,也不会给任何提示,只是所有线程处于阻塞状态,无法继续,代码如下:

package com.eduask.java.thread.deadlock;

class A

{

public synchronized void foo( B b )

{

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 进入了A实例的foo()方法" );    // ①

try

{

Thread.sleep(200);

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 企图调用B实例的last()方法");    // ③

b.last();

}

public synchronized void last()

{

System.out.println("进入了A类的last()方法内部");

}

}

class B

{

public synchronized void bar( A a )

{

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 进入了B实例的bar()方法" );  // ②

try

{

Thread.sleep(200);

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 企图调用A实例的last()方法");  // ④

a.last();

}

public synchronized void last()

{

System.out.println("进入了B类的last()方法内部");

}

}

public class DeadLock implements Runnable

{

A a = new A();

B b = new B();

public void init()

{

Thread.currentThread().setName("主线程");

// 调用a对象的foo方法

a.foo(b);

System.out.println("进入了主线程之后");

}

public void run()

{

Thread.currentThread().setName("副线程");

// 调用b对象的bar方法

b.bar(a);

System.out.println("进入了副线程之后");

}

public static void main(String[] args)

{

DeadLock dl = new DeadLock();

// 以dl为target启动新线程

new Thread(dl).start();

// 调用init()方法

dl.init();

}

}


运行结果如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,656评论 1 114
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,493评论 1 15
  • JUC 原创者:文思,感谢尚硅谷,资料来源于尚硅谷 目录: 1、volatile关键字与内存可见性 2、原子变量与...
    文思li阅读 2,386评论 0 1
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,987评论 1 18
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,724评论 0 3