Java多线程:线程死锁
来源:互联网 发布:8个灯流水灯单片机程序 编辑:程序博客网 时间:2024/06/11 19:50
发生死锁的原因一般是两个对象的锁相互等待造成的。
下面用一个实例来构造这种情况:
下面用一个实例来构造这种情况:
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);}@Overridepublic 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的资源。两个线程在相互等待,出现死锁。
- Java多线程:线程死锁
- Java多线程:线程死锁
- Java多线程-线程死锁
- java多线程之 ---- 线程死锁
- java多线程之线程死锁
- java多线程-线程池-synchronized-死锁
- Java中的多线程,线程锁,以及死锁
- Java多线程之线程同步和死锁
- Java多线程 线程同步与死锁
- Java多线程____线程死锁例子
- 多线程编程---线程死锁
- 【Java多线程】多线程死锁
- Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理
- Java基础_线程_多线程_死锁
- Java对多线程的支持(二) - 线程死锁
- Java菜鸟学习笔记--多线程篇(三):线程死锁
- Java多线程-(8)线程同步、锁、死锁
- Java多线程线程、同步代码块、同步函数、死锁
- 使用SVN进行Unity3d版本管理总结
- 移植中Makefile学习 关键字理解
- WinAPI学习 - PostMessage、RtlFreeHeap、PeekMessage、GetTickCount()
- Struts2实现单文件的上传功能实例详解及源代码
- 自助Linux之问题诊断工具strace
- Java多线程:线程死锁
- 排序算法(冒泡排序、选择排序、插入排序)
- 数据库学习网址
- 搜索引擎简介
- VMM 中 factory 所用的 copy 和 allocate 方法的区别
- Linux故障处理最佳实践
- 博客正式更名啦
- ehcache版本问题导致的一个错误edu.emory.mathcs.backport...
- Struts2完成文件的下载