java-死锁产生的现象与解决办法

死锁的产生原因: 对并发资源的加锁成“环”

问题:如何成环?
下面举例说明:
1.定义两个类,一个本类,一个笔类。

class Pen{
    private String title = "pen";

    @Override
    public String toString() {
        return "Pen{" +
                "title='" + title + '\'' +
                '}';
    }
}

class Book{
    private String title = "book";

    @Override
    public String toString() {
        return "Book{" +
                "title='" + title + '\'' +
                '}';
    }
}

2.主方法实现:

public class Test {
    //这两个线程在堆中,共享资源
    private static Pen pen = new Pen();
    private static Book book = new Book();
    
    public static void main(String[] args) {
----------------- 笔线程-----------------------
        Thread thread1 = new Thread(()->{
            synchronized (pen){ 	//拿到笔的锁去请求本的锁
                System.out.println("我有笔,把你的本给我");
                synchronized (book){ 		//对本上锁
                    System.out.println("把你的本给我");
                }
            }
        });
------------------本线程------------------------
        Thread thread2 = new Thread(()->{
            synchronized (book){ //拿到本的锁去请求笔的锁
                System.out.println("我有本,把你的笔给我");
                synchronized (pen){  //对笔上锁
                    System.out.println("把你的笔给我!!!");
                }
            }
        });
        thread1.start();  //启动笔锁
        thread2.start();   //启动本锁
    }
}

java-死锁产生的现象与解决办法_第1张图片
这时产生死锁:
java-死锁产生的现象与解决办法_第2张图片
注意: 这时候对共享资源有个环。线程1线程2 在访问本的线程时有个环,在访问笔的时候也有个环,此时产生了两个环。

解决办法: 只要有任意一个不成环。(两个线程有任意一个让步就ok了)
java-死锁产生的现象与解决办法_第3张图片
java-死锁产生的现象与解决办法_第4张图片

对共享资源的访问不要成环,成环容易死锁。

算法:银行家算法可以解决死锁问题。

你可能感兴趣的:(lock)