为什么加了s1.append("1")之后会出现死锁?


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){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (s2){
                    }
                }
            }
        }.start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(s2){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    s1.append("1");
//                    s2.append("1");
//                    synchronized (s2){
//
//                    }
                }
            }
        }).start();
    }
}


```

第一个线程中synchronized(s1)锁中加锁s2,下面的线程中锁了s2后处理s1,如果这两个线程并发了,就相互锁死了

你第一个线程先拿到了S1的锁,然后去请求S2的锁,但是此时你第二个线程已经拿到了S2的锁,虽然,在第二个线程里面没有用synchronized,但是锁是存储在对象头里面的,也就是你即使第二个线程没用synchronized,但是S1它作为一个对象,在它的头部已经存储了第一个线程,就是锁住了,所以会出现死锁