1. 程式人生 > >java死鎖產生的原因

java死鎖產生的原因

產生死鎖,至少有兩把鎖,多執行緒。一般是A執行緒獲取A鎖,B執行緒獲取了B鎖,這時A執行緒又要獲取B鎖,B執行緒又要獲取A鎖,從而導致死鎖,這個會出現程式碼不繼續執行了,可以用jconsole分析,哪個執行緒產生了死鎖。

1、程式至少有兩把鎖,相互鎖住。

public class DeadLock implements Runnable{
    private volatile int i=0;
    private Object key = new Object();
    private Object key1 = new Object();
    @Override
    public void run() {
        i++;
        if(i%2 == 0){
            synchronized (key) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (key1) {
                    
                }
            }
        }else{

            synchronized (key1) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (key) {
                    
                }
            }
        
        }
        System.out.println("釋放鎖了");
        
    }

}
 

2、還有一種是鎖住了,但是沒有釋放鎖。可能是中途拋了異常,或者直接return了,導致鎖沒有釋放。

        Lock lock = new ReentrantLock();
        lock.lock();
        String a = null;
        a.toString();
        lock.unlock();