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

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

java多线程之线程死锁

产生死锁的主要原因:

  • 由于系统资源不足。 
  • 进程执行推进的顺序不合适。 
  • 资源分配不当等。 

假设系统资源充足。进程的资源请求都可以得到满足,死锁出现的可能性就非常低。否则就会因争夺有限的资源而陷入死锁。其次,

进程执行推进顺序与速度不同,也可能产生死锁。 

产生死锁的四个必要条件: 

  • 相互排斥条件:一个资源每次仅仅能被一个进程使用。 
  • 请求与保持条件:一个进程因请求资源而堵塞时,对已获得的资源保持不放。

     

  • 不剥夺条件:进程已获得的资源。在末使用完之前。不能强行剥夺。 
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

     

这四个条件是死锁的必要条件。仅仅要系统发生死锁,这些条件必定成立,而仅仅要上述条件之中的一个不满足,就不会发生死锁。 

演示样例:

package com.lock;public class Test implements Runnable {	public int flag = 1;	static Object obj1 = new Object(), obj2 = new Object();	public void run() {		System.out.println("flag= " + flag);		if (flag == 1) {			synchronized (obj1) {				try {					Thread.sleep(500);				} catch (InterruptedException e) {					e.printStackTrace();				}				synchronized (obj2) {					System.out.println("1");				}			}		}		if (flag == 0) {			synchronized (obj2) {				try {					Thread.sleep(500);				} catch (InterruptedException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}				synchronized (obj1) {					System.out.println("0");				}			}		}	}	public static void main(String[] args) {		Test td1 = new Test();		Test td2 = new Test();		td1.flag = 1;		td2.flag = 0;		Thread t1 = new Thread(td1);		Thread t2 = new Thread(td2);		t1.start();		t2.start();	}}

转载地址:http://gqrfm.baihongyu.com/

你可能感兴趣的文章
如何在CentOS 7上修改主机名
查看>>
puppet自动化运维之tag标签puppet自动化运维之tag标签
查看>>
常见问题kernel调优
查看>>
通过vftps和虚拟帐号增强ftp的安全性
查看>>
20个最新的照片 PS 技巧,提升摄影水平
查看>>
通过SAN(Subject Alternative Name)实现证书的多域名安全访问
查看>>
RHEL6 搭建 keepalived + lvs/DR 集群
查看>>
easypanel 的 PHP5.4-7.0 插件
查看>>
System Center Operations Manager 2012 SP1 处理“未监控”对象
查看>>
JQuery链式操作学习对比
查看>>
VXLAN 概念(Part II)- 每天5分钟玩转 OpenStack(109)
查看>>
ASP.NET实际项目演练(1)
查看>>
Java虚拟机的简单介绍
查看>>
OC语法总结
查看>>
codeforces B. Pasha and String(贪心)
查看>>
关于Spring主题的使用心得
查看>>
Outlook小贴士之:撤回和替换邮件
查看>>
Windows Phone 实用开发技巧(30):Pivot切换时同时渐变背景图片
查看>>
利用pg_trgm的gist和gin索引加速字符匹配查询
查看>>
锐起无盘XP安装与配置图文(二)
查看>>