Java中的線程并發(fā)是其重要的特征之一,但資源競(jìng)爭(zhēng)可能會(huì)導(dǎo)致死鎖。在并發(fā)編程中,多個(gè)線程試圖同時(shí)訪問共享的資源,但當(dāng)某個(gè)線程持有資源時(shí),其他線程被阻止,導(dǎo)致資源無(wú)法訪問。這就是典型的死鎖情況。
//示例代碼 public class DeadlockExample { public static void main(String[] args) { Object obj1 = new Object(); Object obj2 = new Object(); Thread t1 = new Thread(() ->{ synchronized (obj1) { System.out.println("Thread1 acquired lock on obj1"); synchronized (obj2) { System.out.println("Thread1 acquired lock on obj2"); } } }); Thread t2 = new Thread(() ->{ synchronized (obj2) { System.out.println("Thread2 acquired lock on obj2"); synchronized (obj1) { System.out.println("Thread2 acquired lock on obj1"); } } }); t1.start(); t2.start(); } }
在上面的代碼中,我們創(chuàng)建了兩個(gè)線程,分別嘗試獲取obj1和obj2的鎖。線程1獲得了obj1的鎖,但它需要obj2的鎖來繼續(xù)執(zhí)行。另一方面,線程2獲得了obj2的鎖,但需要obj1的鎖來繼續(xù)執(zhí)行。由于線程1和線程2互相依賴對(duì)方釋放鎖來繼續(xù)執(zhí)行,它們相互阻塞,最終導(dǎo)致死鎖。
要避免死鎖,我們需要采取一些措施。例如,用同一順序獲取鎖,將鎖變得更細(xì)粒度,或使用tryLock()方法等。鎖的獲取和釋放應(yīng)該很小心,以確保在所有情況下都不會(huì)發(fā)生死鎖。