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的资源。两个线程在相互等待,出现死锁。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 阿里云服务器怎么用ip访问不了

    阿里云服务器怎么用ip访问不了

    2021年10月18日
  • 数字信号处理实验(一)

    实验目的本次实验目的为:在matlab环境下产生几种基本的数字信号,并对这些基本的信号进行运算和变换,同时利用程序结果对采样定理进行验证,深刻理解采样定理。通过自己录制音频信号并对不同的音频信号进行不同处理,加深理解音频信号中声道的原理,以及混声、回声的形成原理。实验内容用matlab产生单位脉冲信号,单位阶跃信号,矩形信号,正弦信号,余弦信号,指数信号,产生并观察f(x)=sinc(x)函数的波

  • mapboxgl中文文档_globalmapper输出

    mapboxgl中文文档_globalmapper输出原文链接:https://blog.csdn.net/supermapsupport/article/details/78343391作者:MR.MapboxGLJS是一个JavaScript

  • WinForm控件之【MaskedTextBox】「建议收藏」

    WinForm控件之【MaskedTextBox】「建议收藏」基本介绍掩码文本控件,使用掩码来区分用户输入文本是否正确。常设置属性BeepOnError:指示键入无效字符是控件是否发出系统提示音;CutCopyMaskFormat:设置控件文本值复制到剪

  • R 检测多重共线性

    R 检测多重共线性多重共线性可用统计量VIF(VarianceInflationFactor,方差膨胀因子)进行检测。VIF的平方根表示变量回归参数的置信区间能膨胀为与模型无关的预测变量的程度(因此而得名)。car包中的vif()函数提供VIF值。一般原则下,vif>2就表明存在多重共线性问题。检测多重共线性>library(car)>vif(fit)PopulationIlliteracyIncomeFrost1.22.21.32.1&g

  • Python+Appium从安装到第一个小练习(保姆级别教程)

    Python+Appium从安装到第一个小练习(保姆级别教程)电脑系统:win10手机:安卓(没钱买苹果)需要的工具可以在这里下载,https://pan.baidu.com/s/1MupElpYcmeQH3uPQ1CUWjw提取码:AJDG

发表回复

您的电子邮箱地址不会被公开。

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