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


相关推荐

  • k8s pod 状态 Evicted[通俗易懂]

    k8s pod 状态 Evicted[通俗易懂]删除Evicted状态的pod[root@hadoop03kubernetes]#kubectlgetpods|grepEvicted|awk'{print$1}’|xargskubectldeletepodpod”glusterfs-2p28b”deleted[root@hadoop03kubernetes]#kubectldescribepodglusterfs-cpft7Name:glusterfs-cpft7N.

    2022年5月13日
  • loadrunner11 中文激活成功教程版(附详细安装教程)[通俗易懂]

    loadrunner11 中文激活成功教程版(附详细安装教程)[通俗易懂]LoadRunner是一款专业级别的应用负载测试工具,它可以模拟上千万用户对企业应用进行真实的负载测试,通过大量实时监测器和精确的分析来得到最真实的数据,并且支持自动重复测试,以确保数值稳定和准确。通过使用LoadRunner,企业能最大限度地缩短测试时间,优化产品性能和加速应用系统的发布周期。LoadRunner适用于各种体系架构,它从用户关注的“响应时间”、“点击次数”或是工业层面的“吞吐量”…

    2022年7月22日
  • 产生随机数算法[通俗易懂]

    产生随机数算法[通俗易懂]两个办法帮你解决如何在Java中产生随机数http://cd.qq.com     随机数在日常的应用和开发中经常会见到,比如说某些系统会为用户生成一个最初的初始化密码,这就是一个随机数。如何生成这个随机数,不同的开发工具的方法也不一样。在应用中,Java是应用最为广泛的开发工具之一,如何在Java中产生随机数,也是很多开发者在初学随机数时的一个必修课,在此为读者贡献两个办法帮你

    2022年7月26日
  • 深入浅析Mysql联合索引原理 之 最左匹配原则。

    深入浅析Mysql联合索引原理 之 最左匹配原则。前言之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和大牛交流中,发现遗漏了些东西,这里自己整理一下这方面的内容。最左前缀匹配原则在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:CREATETABLE`student`(`Id`int(11)unsign…

    2022年6月3日
  • 无线突然变叉,无法使用[通俗易懂]

    无线突然变叉,无法使用[通俗易懂]1.查看了驱动,是正常的2.查看了控制面板,“无线”是开启的2.win + r 输入 services.msc进入策略这个三个改为自动,重启电脑

    2022年8月18日
  • 11.1JS笔记_数据结构手写笔记

    11.1JS笔记_数据结构手写笔记11.1JS笔记

    2022年4月20日

发表回复

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

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