死锁

对锁的使用不恰当时,很容易会造成死锁,死锁不会报异常,只是程序一直不停止,很难调试,最好不要写出死锁的代码。

比如:

A占有了R1资源,但是需要R2资源,B占有了R2资源,但是需要R1资源,A、B此时就会一直陷入等待中......

死锁代码

面试你就有可能遇到让你手写一个死锁代码的题目!

因为只有你会写死锁的代码,知道什么情况下会出现死锁,你才不会在实际开发中写出死锁代码。

例:t1线程锁住了o1,想要锁o2,但是o2已经被t2锁住了,t2又想锁o1,所以线程t1和线程t2都结束不了同步代码块。

package com.dh.deadlock;

public class DeadLock {

    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();
        Thread t1 =new MyThread01(o1,o2);
        Thread t2 =new MyThread02(o1,o2);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
    }
}

class MyThread01 extends Thread {
    private Object o1;
    private Object o2;

    public MyThread01(Object o1, Object o2) {
        this.o1 = o1;
        this.o2 = o2;
    }

    @Override
    public void run() {
        synchronized (o1){
            //确保t2线程锁住o2
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o2){

            }
        }
    }
}

class MyThread02 extends Thread {
    private Object o1;
    private Object o2;

    public MyThread02(Object o1, Object o2) {
        this.o1 = o1;
        this.o2 = o2;
    }
    @Override
    public void run() {
        synchronized (o2){
            synchronized (o1){

            }
        }
    }
}

结果:

程序一直运行,一年十年都是这样。

posted @ 2021-02-23 20:16  deng-hui  阅读(61)  评论(0编辑  收藏  举报