對于Java程序員來說,死鎖和內存泄露是兩個非常常見的問題。那么什么是死鎖和內存泄露呢?
死鎖
死鎖是指兩個或多個進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力干涉那它們都無法推進下去。
public class DeadLockDemo { private static Object resource1 = new Object(); private static Object resource2 = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() ->{ synchronized (resource1) { try { System.out.println("Thread1 is holding the resource1, going to sleep..."); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread1 is trying to get resource2..."); synchronized (resource2) { System.out.println("Thread1 gets resource2!"); } } }); Thread t2 = new Thread(() ->{ synchronized (resource2) { try { System.out.println("Thread2 is holding the resource2, going to sleep..."); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread2 is trying to get resource1..."); synchronized (resource1) { System.out.println("Thread2 gets resource1!"); } } }); t1.start(); t2.start(); } }
上面的代碼就是一個經典的死鎖例子。線程1持有resource1,等待獲取resource2,而線程2持有resource2,等待獲取resource1。因此,程序會被卡住,無法繼續執行。
內存泄露
內存泄漏是指程序在使用動態分配內存時,由于某種原因導致程序無法將已經申請的內存空間釋放,這部分內存便成為了“內存泄漏”。隨著程序的執行,累積了大量無用的內存,導致程序越來越占用內存資源,最終導致程序或系統崩潰。
public class MemoryLeakDemo { private Listlist = new ArrayList<>(); public void add(Integer i) { list.add(i); } public static void main(String[] args) { MemoryLeakDemo demo = new MemoryLeakDemo(); for (int i = 0; i< Integer.MAX_VALUE; i++) { demo.add(i); } } }
上面的代碼演示了如何產生內存泄露。在程序中,不斷向一個List中添加整數,而這個List卻沒有被清空或釋放。因此,隨著循環次數的增加,這個List中的元素會越來越多,占用越來越多的空間,直到程序或系統崩潰。