在Java中,同時只能由一個線程訪問的代碼塊稱為臨界區。Java提供了synchronized和Lock兩個關鍵字來同步多個線程的訪問臨界區。以下是詳細說明:
synchronized關鍵字
synchronized是Java中最常用的同步關鍵字,它可以被應用于方法或代碼塊中。當一個線程試圖訪問一個被synchronized關鍵字修飾的臨界區時,其他的線程只能等待該線程執行完畢并退出該臨界區。
public class SynchronizedExample { private int count = 0; public synchronized void increment() { count++; } }
上面的代碼中,increment方法是一個臨界區,只能同時被一個線程訪問。當一個線程調用increment方法時,其他線程必須等待該線程執行完方法并退出該臨界區。
Lock關鍵字
Lock是Java5提供的一個新的同步機制,它比synchronized更靈活,但使用它需要顯式地獲取和釋放鎖。Lock可以用于控制對共享資源的訪問。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockExample { private Lock lock = new ReentrantLock(); private int count = 0; public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } }
在上面的代碼中,一個lock對象被創建,它是ReentrantLock類的實例。increment方法獲取鎖,執行count++操作,然后釋放鎖。如果線程不能獲取鎖,則它就在那里等待,直到鎖可用。
總之,鎖是一種更加靈活的同步方式,但它需要更多的代碼來實現同步,因為鎖需要手動獲取和釋放。
上一篇css 回到頂部按鈕
下一篇java json查找