首页 > 代码库 > java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。
线程死锁产生的条件:
- 当两个线程相互调用Join()方法。
- 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁。
下面看代码:
代码1:死锁的案例
package com.lp.ecjtu.Thread;/*死锁:常见情景之一:同步的嵌套。*/class Ticket implements Runnable{ private int num = 100; Object obj = new Object(); boolean flag = true; public void run() { if(flag) while(true) { synchronized(obj)//同步代码块里面调用同步函数 { show(); } } else while(true) this.show(); } public synchronized void show()//同步函数里面的调用同步代码块 { synchronized(obj) { if(num>0) { try{Thread.sleep(10);}catch (InterruptedException e){} System.out.println(Thread.currentThread().getName()+".....sale...."+num--); } } }}public class DeathLockThread1 { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try{Thread.sleep(10);}catch(InterruptedException e){} t.flag = false; t2.start(); }}
代码2:
package com.lp.ecjtu.Thread; class DeathLockRunable implements Runnable{ private boolean flag; public DeathLockRunable(boolean flag){ this.flag = flag; } @Override public void run() { if(flag){ synchronized (Lock.mylock1){ System.out.println("if mylock1"+Thread.currentThread().getName()); synchronized (Lock.mylock2){ System.out.println("if mylock2"+Thread.currentThread().getName()); } } }else{ synchronized (Lock.mylock2){ System.out.println("else mylock2"+Thread.currentThread().getName()); synchronized (Lock.mylock1){ System.out.println("else mylock1"+Thread.currentThread().getName()); } } } }} class Lock{ static Object mylock1 = new Object(); static Object mylock2 = new Object(); } public class DeathLockThread{ public static void main(String[] args){ Thread t1 = new Thread(new DeathLockRunable(true)); Thread t2 = new Thread(new DeathLockRunable(false)); t1.start(); t2.start(); } }
输出结果:if mylock1Thread-0
else mylock2Thread-1
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。