博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程:线程死锁
阅读量:5094 次
发布时间:2019-06-13

本文共 2967 字,大约阅读时间需要 9 分钟。

发生死锁的原因通常是两个对象的锁相互等待造成的。
以下用一个实例来构造这样的情况:
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://www.cnblogs.com/yxwkf/p/3826735.html

你可能感兴趣的文章
Hyperledger02
查看>>
Java开发中的23种设计模式
查看>>
2014 Super Training #2 F The Bridges of Kolsberg --DP
查看>>
测试 code style
查看>>
电动车充电器原理及带电路图维修
查看>>
快速乘 防爆乘 快速幂
查看>>
Confluence 6 从外部目录中同步数据支持的目录类型
查看>>
【习题 6-5 UVA-1600】Patrol Robot
查看>>
【BZOJ 4516】生成魔咒
查看>>
深浅拷贝和数列,变量的区别
查看>>
从零开始搭建框架SSM+Redis+Mysql(一)之摘要
查看>>
IDE - idea - tab - 方法相关的移动
查看>>
Ansible - playbook 概要
查看>>
jQuery源码分析(1) - 连字符如何变驼峰写法
查看>>
jQuery源码分析(2) - 为什么不用new jQuery而是用$()
查看>>
jQuery源码分析(3) - 判断传入对象是否为function或array
查看>>
[转]【EL表达式】11个内置对象(用的少) & EL执行表达式
查看>>
【jsp】案例:显示商品列表 & 问题:List内添加元素,为什么值都变成一样的了...
查看>>
ArrayList对象声明& arrayList.size()
查看>>
并发编程 线程
查看>>