在Java世界里,鎖是一個非常重要的概念。它的作用是確保同一時間只有一個線程可以訪問某個共享資源。在Java中,鎖可以分成以下幾種:
1. synchronized關鍵字
通過關鍵字synchronized,可以加鎖/解鎖某個同步代碼塊或者方法。這種鎖機制叫做內部鎖。內部鎖是Java虛擬機提供的一種高層次抽象,它被置于對象的頭部。內部鎖使用起來非常簡單,但是只能用于同一個JVM中的多個線程之間。
public synchronized void increment() { count++; }
2. ReentrantLock類
ReentrantLock是Java自帶的一個鎖工具類,可以通過lock()和unlock()方法來申請和釋放鎖。與synchronized關鍵字不同,ReentrantLock是一個顯示鎖,需要手動加鎖和解鎖。它可以實現公平鎖和非公平鎖,還可以通過tryLock()方法來控制鎖的等待時間。ReentrantLock適合用于一些需要更高級控制的場景。
private final ReentrantLock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } }
3. ReadWriteLock接口
ReadWriteLock是一種讀寫分離鎖,它允許多個線程同時讀取共享資源,但是只允許一個線程寫入共享資源。在讀多寫少的場景下,使用ReadWriteLock可以提高程序的效率。
private final ReadWriteLock lock = new ReentrantReadWriteLock(); public void read() { lock.readLock().lock(); try { //read the value } finally { lock.readLock().unlock(); } } public void write() { lock.writeLock().lock(); try { //write the value } finally { lock.writeLock().unlock(); } }
總結
以上三種鎖機制都可以用來確保多個線程訪問共享資源的安全。內部鎖適合用于簡單的業務場景,而ReentrantLock和ReadWriteLock適合用于需要更加復雜的場景。在選擇鎖的時候,需要根據業務需求來選取,以達到最佳的程序效率。