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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据挖掘十大算法之Apriori算法「建议收藏」

    数据挖掘十大算法之Apriori算法「建议收藏」文章目录1.“啤酒与尿布”的案例2.Aprior算法核心术语事物集记录(事务)项目(项)项目集(项集)K项集支持度(Support)置信度(Confidence)最小支持度(min_support)最小置信度(min_confidence)提升度频繁K项(目)集候选K项(目)集3.Aprior算法的三大性质(关联规则的三大性质)4.Aprior算法实现过程5.数据挖掘5.1寻找关联属性5.2生成关联规则5.3更加严谨的栗子6.Aprior算法的优缺点6.1改进Aprior算法6.2F

    2022年5月1日
    45
  • 计算机应用网线接口亮红灯,网线插在电脑上网口灯不亮是为什么?

    计算机应用网线接口亮红灯,网线插在电脑上网口灯不亮是为什么?1、网线插在电脑上网口灯不亮,应该是接触不良。2、如有你已经把上网的网线,插在了路由器的WAN口,但是WAN口指示灯仍然不亮。这时候,请检查以下几个方面的问题:检查网线是否插好,网线是否有问题。3、如果确认网线没有松动,已经插好了;但是,WAN口指示灯还是不亮的话。那么,就有可能是插在路由器WAN口的网线有问题,导致路由器WAN口检测不到信号,所以路由器WAN口指示灯不亮。4、建议大家尽量使用质量…

    2022年6月26日
    122
  • Springmvc工作原理详解

    Springmvc工作原理详解关于三层架构和MVC我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器。在JavaEE开发中,几乎全都是基于B/S架构的开发。那么在B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多,所以我们课程中的案例也都是基于三层架构设计的。三层架构中,每一层各司其…

    2022年5月15日
    38
  • 联合主键注解「建议收藏」

    联合主键注解「建议收藏」//含有联合主键的映射@Entity@Getter@Setter@Table(name=”sign_table”)@IdClass(InfoLeadersId.class)publicclassInfosLeadersextendsBaseEntityimplementsSerializable{@Id@Column(name=”info_id”)privateLonginfoId;@Id@Column(name=.

    2022年6月26日
    66
  • Struts2漏洞总结

    Struts2漏洞总结Struts2漏洞总结

    2022年7月19日
    18
  • wxpython-wxpython教程

    wxpython-wxpython教程wxPython是一个Python包装wxWidgets(这是用C++编写),一个流行的跨平台GUI工具包。由RobinDunn以及HarriPasanen开发,wxPython是作为一个Python扩展模块。就像wxWidgets,wxPython也是一个免费的软件。它可以从官方网站下载:http://wxpython.org.在本网站上可下载wxPython对应操作系统平台二进…

    2022年5月11日
    20

发表回复

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

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