Java多线程(3)——死锁问题
来源:互联网 发布:南岸南山植物园淘宝 编辑:程序博客网 时间:2024/05/21 09:46
调试线程化的程序
在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁、活锁、内存损坏和资源耗尽。
死锁
死锁可能是多线程程序最常见的问题。当一个线程需要一个资源而另一个线程持有该资源的锁时,就会发生死锁。这种情况通常很难检测。但是,解决方案却相当好:在所有的线程中按相同的次序获取所有资源锁。例如,如果有四个资源 ―A、B、C 和 D ― 并且一个线程可能要获取四个资源中任何一个资源的锁,则请确保在获取对 B 的锁之前首先获取对 A 的锁,依此类推。如果“线程 1”希望获取对 B 和 C 的锁,而“线程 2”获取了 A、C 和 D 的锁,则这一技术可能导致阻塞,但它永远不会在这四个锁上造成死锁。
活锁
当一个线程忙于接受新任务以致它永远没有机会完成任何任务时,就会发生活锁。这个线程最终将超出缓冲区并导致程序崩溃。试想一个秘书需要录入一封信,但她一直在忙于接电话,所以这封信永远不会被录入。
内存损坏
如果明智地使用 synchronized 关键字,则完全可以避免内存错误这种气死人的问题。
资源耗尽
某些系统资源是有限的,如文件描述符。多线程程序可能耗尽资源,因为每个线程都可能希望有一个这样的资源。如果线程数相当大,或者某个资源的侯选线程数远远超过了可用的资源数,则最好使用 资源池。一个最好的示例是数据库连接池。只要线程需要使用一个数据库连接,它就从池中取出一个,使用以后再将它返回池中。资源池也称为 资源库。
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
class Test implements Runnable{private boolean flag;Test(boolean flag){this.flag = flag;}public void run(){if(flag){while(true)synchronized(MyLock.locka){System.out.println(Thread.currentThread().getName()+"..if locka....");synchronized(MyLock.lockb){System.out.println(Thread.currentThread().getName()+"..if lockb....");}}}else{while(true)synchronized(MyLock.lockb){System.out.println(Thread.currentThread().getName()+"..else lockb....");synchronized(MyLock.locka){System.out.println(Thread.currentThread().getName()+"..else locka....");}}}}}class MyLock{public static final Object locka = new Object();public static final Object lockb = new Object();}class DeadLockTest {public static void main(String[] args) {Test a = new Test(true);Test b = new Test(false);Thread t1 = new Thread(a);Thread t2 = new Thread(b);t1.start();t2.start();}}
常见的预防死锁的方法:
1.有序资源分配法
2.银行家算法
- Java多线程(3)——死锁问题
- java 多线程死锁问题
- java多线程死锁问题
- Java多线程(八)——死锁
- Java多线程(6)——死锁
- Java多线程㈢—死锁(示例)
- Java多线程——死锁
- 黑马程序员:Java基础——多线程的死锁问题
- Java多线程——安全与死锁问题
- java语言基础(93)——多线程中的死锁问题
- java例程练习(多线程[死锁问题])
- Java多线程死锁问题测试
- Java 多线程同步、死锁问题
- java多线程详解六 多线程死锁问题
- Java线程和多线程(九)——死锁
- JAVA多线程——死锁分析
- Java多线程初探——死锁
- Java Tread多线程(3)死锁
- symbol dyld_stub_binding_helper not found, normally in crt1.o/dylib1.o/bundl
- [设计原则1]GRASP --高内聚低耦合
- cocos2d-x内存管理机制解析(一)
- Ajax 简单调用
- C++11: nullptr、默认函数的控制、lambda函数、对齐方式
- Java多线程(3)——死锁问题
- Cocos2d-x内存管理(二)
- 数据链路层
- linux设备树dts移植详解
- 不同浏览器对HTTP请求最大数的限制
- [算法导论]第七章《快速排序》
- SQL的内连接与外连接
- jquery选择器
- Java Request方法总结