java知识系列之线程死锁
2013-02-01 14:39
351 查看
线程死锁:
a线程锁定了1号资源,下一步需要锁定2号资源。
b线程锁定了2号资源,下一步需要锁定1号资源。
两个线程无限制的等待下去,于是就出现了死锁。
引用网上的实例:
避免死锁的方法:
1.让所有的线程按照同样的顺序获得一组锁。这种方法消除了a和b的拥有者分别等待对方的资源的问题。
2.将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。
3.将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。
修改方法1:
a线程锁定了1号资源,下一步需要锁定2号资源。
b线程锁定了2号资源,下一步需要锁定1号资源。
两个线程无限制的等待下去,于是就出现了死锁。
引用网上的实例:
package test; public class TestDeadLock extends Thread { static Object o1 = new Object(), o2 = new Object(); int flag = 0; public void run() { if(flag == 0){ synchronized (o1) { System.out.println("a锁定了刀,想要叉"); try { this.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2){ System.out.println("a 要叉成功"); } } } if(flag == 1){ synchronized (o2) { System.out.println("b锁定了叉,想要刀"); try { this.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1){ System.out.println("b 要刀成功"); } } } } public static void main(String[] args) { TestDeadLock tdl1 = new TestDeadLock(); TestDeadLock tdl2 = new TestDeadLock(); tdl1.flag = 0; tdl2.flag = 1; tdl1.start(); tdl2.start(); } }
避免死锁的方法:
1.让所有的线程按照同样的顺序获得一组锁。这种方法消除了a和b的拥有者分别等待对方的资源的问题。
2.将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。
3.将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。
修改方法1:
package test; public class TestDeadLock extends Thread { static Object o1 = new Object(), o2 = new Object(); int flag = 0; String threadName; public TestDeadLock(String threadName){ this.threadName = threadName; } /** * 把两个方法合并到一个同步块中 */ public synchronized void getCanju(){ System.out.println(threadName+"锁定了刀,想要叉"); try { this.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(threadName+"要叉成功"); } public void run() { getCanju(); } public static void main(String[] args) { TestDeadLock tdl1 = new TestDeadLock("线程1"); TestDeadLock tdl2 = new TestDeadLock("线程2"); tdl1.start(); tdl2.start(); } }
相关文章推荐
- java知识系列之线程
- java多线程系列5-死锁与线程间通信
- Java 线程与并发研究系列六(死锁)
- Java__线程---基础知识全面实战---坦克大战系列为例
- 线程的相关知识、JAVA实现死锁、生产者消费者问题
- 【java面试系列之操作系统】进程和线程、死锁、内存管理方式
- JAVA基础知识系列---线程与进程
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
- Java线程:并发协作-死锁
- Java 线程的同步(synchronized)与死锁
- Java多线程设计(二)线程的基本知识(3)线程的协调
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
- Java多线程系列--“基础篇”05之 线程等待与唤醒 (r)
- Java并发:隐藏的线程死锁
- 智渔课堂官方免费教程四十一 :Java基础教程之线程死锁
- java知识系列之集合类
- java基础知识系列---面向对象思想的理解
- Java线程知识深入解析
- Java线程死锁及解决方案
- java多线程系列----------- 基本的线程机制(二)