java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
2014-08-09 11:20
501 查看
死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。
线程死锁产生的条件:
当两个线程相互调用Join()方法。
当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁。
下面看代码:
代码1:死锁的案例
代码2:
输出结果:if mylock1Thread-0
else mylock2Thread-1
线程死锁产生的条件:
当两个线程相互调用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
相关文章推荐
- java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
- java基础知识回顾之java Thread类学习(九)--wait和notify区别
- java学习日记(6)____多线程的安全问题与死锁的产生
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
- java基础知识回顾之java Thread类学习(十一)--join方法的理解
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
- java基础知识回顾之java Thread类学习(十二)-- 线程中断
- java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)
- java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁
- 黑马程序员——JAVA基础之多线程的安全问题
- 黑马程序员 java基础 继承thread多线程学习日志
- Java基础-多线程-②多线程安全问题
- 黑马程序员学习log第四篇基础知识:JAVA的面向对象之多线程总结
- JAVA基础知识之java多线程时数据同步问题
- 黑马程序员:Java基础——多线程之安全问题与同步
- 黑马程序员--java多线程和单例模式--java学习日记3(基础知识)
- Java 学习笔记16:用ThreadLocal解决多线程安全问题