形成死鎖的4個必要條件:
1、互斥條件:在一段時間內某資源只由一個進程占用。如果此時還有其它進程請求資源,就只能等待,直至占有資源的進程用畢釋放。
2、占有且等待條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3、不可搶占條件:別人已經占有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過來。
4、循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。(比如一個進程集合,A在等B,B在等C,C在等A)。
如何避免線程死鎖呢?
1、避免一個線程同時獲得多個鎖;
2、避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源;
3、嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制。