Java中的鎖是一種線程同步的機制,它提供了一種保護共享資源免受并發訪問的方法。鎖分為獨占鎖和共享鎖,其中獨占鎖只允許一個線程進入鎖定代碼區,而共享鎖允許多個線程同時進入鎖定代碼區。鎖的使用可以通過不同的方式實現,包括基于synchronized關鍵字的鎖和基于java.util.concurrent包中提供的鎖。
public class LockExample { private final Object lock = new Object(); public void doSomething() { synchronized (lock) { // 需要保護的代碼 } } }
除了鎖以外,Java還提供了一種更高級的線程同步機制,稱為監視器(monitor)。監視器可以被認為是一種特殊的鎖,它提供了更好的線程同步控制,允許線程等待并發訪問共享資源的變化。Java中所有的對象都有一個內部監視器,也稱為“對象鎖”,可以通過使用synchronized關鍵字來訪問。
public class MonitorExample { private final Object monitor = new Object(); public void doSomething() { synchronized (monitor) { while (/* 條件不滿足 */) { try { monitor.wait(); } catch (InterruptedException e) { // 處理中斷異常 } } // 需要保護的代碼 } } }
在監視器的例子中,我們使用了wait()方法來掛起線程,直到其他線程通過notify()或notifyAll()方法通知它們可以繼續執行。這種方式可以有效地避免線程爭用和無限循環等問題,提高了程序的可靠性和可維護性。