java-13-死锁
来源:互联网 发布:263网络会议室 编辑:程序博客网 时间:2024/05/29 10:46
1 死锁
是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象, 若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
2 死锁的发生必须具备以下四个必要条件
1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
3 死锁产生的原因
(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
4. 死锁的例子
常见情景之一: 同步的嵌套
package Thread_study;class Mylock{ public static Mylock lockA = new Mylock(); public static Mylock lockB = new Mylock();}class Test implements Runnable{ boolean flag ; Test(boolean flag) { this.flag = flag; } public void method() { if(flag) { while(true) synchronized (Mylock.lockA) { System.out.println("if......lockA"); synchronized (Mylock.lockB) { System.out.println("if......lockB"); } } } else { while (true) synchronized (Mylock.lockB) { System.out.println("else.......lockB"); synchronized (Mylock.lockA) { System.out.println("else.......lockA"); } } } } public void run() { this.method(); }}public class DeadLockDemo4{ public static void main(String[] args) { Test p1 = new Test(true); // Test p2 = new Test(false); Thread t1 = new Thread(p1); Thread t2 = new Thread(p1); t1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } p1.flag = false; t2.start(); }}
例2
public class SynFunLockDemo3 { public static void main(String[] args) { TicketDemo p = new TicketDemo(); Thread t1 = new Thread(p); Thread t2 = new Thread(p); t1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } p.flag = false; t2.start(); }}class TicketDemo implements Runnable{ private int num = 1000; boolean flag = true; Object obj = new Object(); //同步函数 public synchronized void sale() { synchronized (obj) { if (num > 0) { try { Thread.sleep(10);// } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "...function sale..." + num--); } } } public void run() { if(flag) while (true) { synchronized (obj) { this.sale(); } } else { while(true) { this.sale(); } } }}
阅读全文
0 0
- java-13-死锁
- java死锁,避免死锁
- Java并发系列-13、死锁
- Java.死锁
- Java死锁
- java死锁
- java ----死锁
- Java死锁
- java 死锁
- Java - 死锁
- java 死锁
- JAVA 死锁
- java死锁
- java死锁
- Java死锁
- Java - 死锁
- Java 死锁
- java 死锁
- 面向对象--main函数
- Linux系统调用的实现机制分析
- 视频解析工具
- 路径数组变为统计数组
- spring-dao配置
- java-13-死锁
- 3.6 Java static关键字-静态变量
- spark安装和编译
- 剑指offer之把二叉树打印成多行(Python)
- DevOps不能说的秘密
- numpy学习笔记(一)
- 2017年11月5日 第二十七次总结
- imx6q 串口设置
- python3.6 在windows 系统下安装mysqldb