Day13_73_死锁

死锁

  • 什么是死锁?

    - 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
    
  • 死锁出现的原因?

    (1) 因为系统资源不足。  如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
    
    (2) 进程运行推进顺序不合适。 进程运行推进顺序与速度不同,也可能产生死锁。互相等待对放释放彼此所需要的锁。
    
    (3) 资源分配不当等。
    
  • 死锁产生的条件?

    (1) 互斥条件:  一个资源每次只能被一个进程使用。
    
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    
    (3) 不剥夺条件: 进程已获得的资源,在末使用完之前,不能强行剥夺。
    
    (4) 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。
    
     这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
    
  • 死锁的解除与预防:

    - 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。
    
    - 在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。
    
    - 此外,也要防止进程在处于等待状态的情况下占用资源。 因此,对资源的分配要给予合理的规划。
    
  • 死锁代码实例

    
    public class DeadLock {
        public static void main(String[] args) {
    
            //创建对象
             Object o1=new Object();
             Object o2=new Object();
    
            //创建线程  两个线程传入了相同的对象
            Thread t1=new Thread(new T1(o1,o2)); 
            Thread t2=new Thread(new T2(o1,o2));
    
            //启动线程
            t1.start();
            t2.start();
    
        }
    }
    
    

//定义第一个线程
 class T1 implements Runnable{
   
     //属性
        Object o1;
        Object o2;

     //构造方法
        T1(Object o1,Object o2){
          this.o1=o1;
          this.o2=o2;
       }

  // 重写run方法
        @Override
        public void run()  {

           synchronized (o1){
              try {
                  Thread.sleep(5000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
               synchronized (o2){

              }
          }
     }
 }



 //定义第二个线程

 class T2 implements Runnable{

        Object o1;
        Object o2;

        T2(Object o1,Object o2){
            this.o1=o1;
            this.o2=o2;

        }

        // 重写run方法
        @Override
        public void run() {
          synchronized (o2){
              try {
                   Thread.sleep(5000);
              } catch (InterruptedException e) {
                   e.printStackTrace();
               }
                synchronized (o1) {

              }
          }
        }
    }
posted @ 2021-04-08 15:38  失昼  阅读(42)  评论(0)    收藏  举报