Java多线程:线程死锁

Java多线程:线程死锁

发生死锁的原因通常是两个对象的锁相互等待造成的。
以下用一个实例来构造这样的情况:

package basic.e_deadlock;

import org.apache.log4j.Logger;

public class TestDeadLock {
	public static void main(String[] args) {
		DeadlockRisk dead = new DeadlockRisk();
		MyThread t1 = new MyThread(dead, 1, 2, "线程1");
		MyThread t2 = new MyThread(dead, 3, 4, "线程2");
		MyThread t3 = new MyThread(dead, 5, 6, "线程3");
		MyThread t4 = new MyThread(dead, 7, 8, "线程4");
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

class MyThread extends Thread {
	private DeadlockRisk dead;
	private int a, b;

	MyThread(DeadlockRisk dead, int a, int b, String threadName) {
		this.dead = dead;
		this.a = a;
		this.b = b;
		this.setName(threadName);
	}

	@Override
	public void run() {
		dead.read();
		dead.write(a, b);
	}
}

class DeadlockRisk {
	private static Logger logger = Logger.getLogger(DeadlockRisk.class);
	private static class Resource {
		public int value;
	}

	private Resource resourceA = new Resource();
	private Resource resourceB = new Resource();

	public void read() {
		logger.debug("===========read  begin===========");
		synchronized (resourceA) {
			logger.debug("read():" + Thread.currentThread().getName() + "获取了resourceA 的锁!");
			synchronized (resourceB) {
				logger.debug("read():" + Thread.currentThread().getName() + "获取了resourceB 的锁!");
			}
		}
		logger.debug("===========read  end=============");
	}

	public void write(int a, int b) {
		logger.debug("===========write begin===========");
		synchronized (resourceB) {
			logger.debug("write():" + Thread.currentThread().getName() + "获取了resourceB 的锁!");
			synchronized (resourceA) {
				logger.debug("write():" + Thread.currentThread().getName() + "获取了resourceA 的锁!");
				resourceA.value = a;
				resourceB.value = b;
			}
		}
		logger.debug("===========write end=============");
	}
}

运行结果:

0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========
0    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========
0    [线程4] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========
0    [线程3] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  begin===========
0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - read():线程1获取了resourceA 的锁!
0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - read():线程1获取了resourceB 的锁!
0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  end=============
0    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - read():线程2获取了resourceA 的锁!
0    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - ===========write being===========
1    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - read():线程2获取了resourceB 的锁!
1    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - ===========read  end=============
1    [线程2] DEBUG basic.e_deadlock.DeadlockRisk - ===========write being===========
1    [线程1] DEBUG basic.e_deadlock.DeadlockRisk - write():线程1获取了resourceB 的锁!
1    [线程4] DEBUG basic.e_deadlock.DeadlockRisk - read():线程4获取了resourceA 的锁!

注意:此时线程1在等待resourceB的资源,线程2在等待resourceA的资源。两个线程在相互等待,出现死锁。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119121.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

    java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别最近用到了clone方法,并且遭遇到各种奇怪的bug;一,浅拷贝浅拷贝:对基本类型的数据是值拷贝,对String类型的拷贝也可以看作是值拷贝,这里不做讨论;浅拷贝是什么呢,先上一段代码,对着看代码很容易理解: Vector<Vector>data=newVector<Vector>(); for(inti=0;i<4;i++){ …

    2022年10月1日
    6
  • 关于ADRC的一些粗鄙之语

    关于ADRC的一些粗鄙之语摘自:https://zhuanlan.zhihu.com/p/156228260关于ADRC的一些粗鄙之语隔壁unclewang机械工程Ph.D&控制算法小萌新across等写在之前其实作者本人开始研究adrc也不是特别久,与很多人一样,接触这个算法之后心态也经历过从一开始的“不明觉厉”、中途的“不以为然”到最后的辩证看待的演变过程。经历了一段时间的学习还有群里面大佬的熏陶之后,对于adrc总算是有了一些系统性的想法,这里就简要介绍一下自己的感悟吧。本文.

    2022年5月19日
    50
  • 7-9 集合相似度 给定两个整数集合,它们的相似度定义为:N ​c ​​ /N ​t ​​ ×100%。其中N ​c ​​ 是两个集合都有的不相等整数的个数,N ​t ​​ 是两个集合一共有的不相「建议收藏」

    7-9 集合相似度 给定两个整数集合,它们的相似度定义为:N ​c ​​ /N ​t ​​ ×100%。其中N ​c ​​ 是两个集合都有的不相等整数的个数,N ​t ​​ 是两个集合一共有的不相「建议收藏」7-9 集合相似度 给定两个整数集合,它们的相似度定义为:N ​c ​​ /N ​t ​​ ×100%。其中N ​c ​​是两个集合都有的不相等整数的个数,N ​t ​​ 是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。输入格式: 输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤10 ​4 ​​)…

    2022年8月18日
    11
  • 在类中如何使用 Server.MapPath

    在类中如何使用 Server.MapPath直接在类中使用Server.MapPath会出现错误,这是由于类中不能直接使用System.Web.UI.Page的非静态函数造成的。解决方法有两种:方法一、为类增加继承classCFoo:System.Web.UI.Page方法二、利用上下文直接使用System.Web.HttpContext.Current.Server.MapPath在使用方法一时请注意:C#中,派生类只能从一个类中继承。方法二中,System.Web.HttpContext.Current中System.Web是

    2022年7月15日
    13
  • python处理通达信 5分钟数据 .lc5文件处理,生成csv文件,期货回测

    python处理通达信 5分钟数据 .lc5文件处理,生成csv文件,期货回测importstructimportdatetimeimportmathimporttime#根据二进制前两段拿到日期分时defget_date_str(H1,H2):year=math.floor(H1/2048)+2004month=math.floor(H1%2048/100)day=H1%2048%100hour=math.floor(H2/60)minute=H2%6.

    2022年7月24日
    29
  • 使用jks文件为apk签名

    使用jks文件为apk签名参与的项目近期要求安全检测,apk不达标并且无法修复的话会要求使用官方加固包。加固之后的包签名会失效,所有需要重新进行签名。今天借此机会记录一下整个操作流程。原来apk是使用jks格式的签名文件来操作的,还有一种是keystore文件格式。我们先来看jks文件格式怎么操作一、jks格式操作步骤:1、基本语法jarsigner-digestalgSHA1-sigalgSHA1withRSA-verbose-keystore{签名文件}-storepass{签名密码}-signe.

    2022年6月10日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号