【Java学习】死锁(22)



什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

举例:
例如,现在又一支笔和一个本子,
现在有两个线程,线程一抢到了笔,线程二抢到了本子,
线程一说,你把本子给我,我就可以把笔给你,
线程二说,你把本子给我,我就把笔给你.
现在就造成了一种循环等待的情况.就是死锁

举例:
一桌人吃饭,每人只有一支筷子,每次只能有一半的人拿起左边和右边的筷子,然后吃饭,如果现在每个人都拿起了自己的一支筷子,则谁也不愿意放下,就会造成死锁.

死锁现象:
出现在同步代码块相互嵌套,多个线程 互相持有对方的锁,而不释放,造成线程一直处于阻塞状态

死锁问题概述
如果出现了同步嵌套,就容易产生死锁问题
死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象


死锁代码:

线程类:

package com.westos.morning;

public class MyThread extends Thread {
    //死锁
    public static Object obj1=new Object();
    public static Object obj2=new Object();
    Boolean flag;
    public MyThread(Boolean flag) {
        this.flag=flag;
    }

    public MyThread() {

    }

    @Override
    public void run() {
        if (flag) {
            synchronized (obj1) {
                System.out.println("true 进入 obj1");
                try {
                    sleep(10);//为了效果明显,加了点延时
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println("true 进入 obj2");
                }
            }
        } else {
            synchronized (obj2) {
                System.out.println("flase 进入 obj2");
                synchronized (obj1) {
                    System.out.println("flase 进入 obj1");
                }
            }
        }


    }}

主类:

package com.westos.morning;

public class Demo2 {
    //死锁

    public static void main(String[] args) {
        MyThread myThread = new MyThread(true);
        MyThread myThread1 = new MyThread(false);
        myThread.start();
        myThread1.start();
    }
}

形成了循环等待
【Java学习】死锁(22)


谢谢!