死锁问题

1.死锁的理解
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

2.说明:
* 1出现死锁后,不会出现异常,不会出现提示,只是所的线程都处于阻塞状态,无法继续
* 2我们使用同步时,要避免出现死锁。

package main.exer;

/**
 * @Author lx
 * @Description 死锁问题
 * @Date 21:39 2020/8/5
 * @Version
 */
public class DeadLock {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer();
        StringBuffer s2 = new StringBuffer();

        new Thread(){
        @Override
        public void run() {
            synchronized (s1){
                s1.append("a");
                s2.append("1");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (s2){
                    s1.append("b");
                    s2.append("2");

                    System.out.println(s1);
                    System.out.println(s2);
                }
            }
        }
    }.start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (s2){
                    s1.append("c");
                    s2.append("3");

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (s1){
                        s1.append("d");
                        s2.append("4");


                        System.out.println(s1);
                        System.out.println(s2);
                    }

                }

            }
        }).start();

    }


}

 

此例中创建了两个线程 当两个线程同时开始执行时 

线程一遇到synchronized握住s1锁 向下执行 同时线程二遇到synchronized握住s2锁,两个线程同时向下执行,

当线程一又遇到synchronized还需要握住s2锁才能继续执行代码,而线程2同时遇到synchronizedye需要握住s1锁才能执行。

(注意此时线程一并没有释放s1锁,线程二没有释放s2锁) 两者都在等待对方释放握住的锁,而释放锁的条件是执行完代码,但是执行完代码的条件是需要对方释放锁。。。。此时进入死锁。

 

posted @ 2020-08-05 22:29  lixia64  阅读(94)  评论(0编辑  收藏  举报