[关闭]
@frank-shaw 2015-10-29T10:52:51.000000Z 字数 1199 阅读 1881

死锁知识

java.多线程


先写一个死锁程序试试吧:

  1. package 死锁;
  2. /*
  3. * 这道题的难点在于两把锁如何设置的问题。需要另外一个类
  4. * 中的两个静态变量来实现这两把锁,而且必须要new
  5. */
  6. public class DeadLockTest {
  7. public static void main(String[] args) {
  8. Source s1 = new Source(true);
  9. Source s2 = new Source(false);
  10. new Thread(s1).start();
  11. new Thread(s2).start();
  12. }
  13. }
  14. //两把锁
  15. class Lock{
  16. static Object lockA = new Object();
  17. static Object lockB = new Object();
  18. }
  19. class Source implements Runnable{
  20. boolean flag;
  21. public Source(boolean f){
  22. this.flag = f;
  23. }
  24. @Override
  25. public void run() {
  26. while(true){
  27. if(flag){
  28. synchronized(Lock.lockA){
  29. System.out.println("true时候的lockA");
  30. synchronized(Lock.lockB){
  31. System.out.println("true时候的lockB");
  32. }
  33. }
  34. }
  35. else{
  36. synchronized(Lock.lockB){
  37. System.out.println("false时候的lockB");
  38. synchronized(Lock.lockA){
  39. System.out.println("false时候的lockA");
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }

注意,上面的程序写的是针对线程的死锁程序,不过可以类比延伸到进程中去。以下部分来自操作系统的知识,主题对象为进程。那么,让我们来试试分析一下死锁的原因:

产生死锁的原因:

一是系统提供的资源数量有限,不能满足每个进程的使用;
二是多道程序运行时,进程推进顺序不合理

产生死锁的必要条件是:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

破坏死锁

根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列预防措施(死锁未发生)

1、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件。这有点流氓啊。

2、采用资源有序分配法,破坏循环等待条件。在资源一开始分配的时候就注重有序分配,一步一步来。

如果死锁已经发生,那么怎么办呢?解除死锁常常采用下面两种方法:
1、资源剥夺法:也就是类似于上面所讲到的流氓做法。

2、撤消进程法:一次撤销一个进程,知道不发生死锁为止。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注