在Java中,鎖是用來保護共享資源的一種機制。當多個線程同時訪問共享資源時,鎖可以用來確保每個線程按照特定順序執行,以避免線程間的競爭和沖突。Java中的鎖可以根據用途和作用范圍進行分類。
分類
1. 互斥鎖
synchronized(key){ //代碼塊 }
互斥鎖是Java中最常用的一種鎖類型。它會阻止其他線程訪問被鎖定的代碼塊,直到持有鎖的線程執行完畢并釋放鎖。
2. 讀寫鎖
ReadWriteLock lock = new ReentrantReadWriteLock(); lock.readLock().lock(); try{ //讀操作 }finally{ lock.readLock().unlock(); } lock.writeLock().lock(); try{ //寫操作 }finally{ lock.writeLock().unlock(); }
讀寫鎖是一種特殊的鎖,它可以同時允許多個線程對共享資源進行讀取操作,但只允許一個線程進行寫操作。這樣做可以提高讀取效率,但寫操作需要等待所有讀操作執行完畢后再進行。
3. 可重入鎖
ReentrantLock lock = new ReentrantLock(); lock.lock(); try{ //代碼塊 }finally{ lock.unlock(); }
可重入鎖是一種允許同一個線程多次獲取同一個鎖的特殊鎖。在使用可重入鎖時,同一線程可以多次對同一鎖進行加鎖和解鎖操作,這可以避免死鎖等問題。
使用
對于不同的線程鎖分類,我們會實現不同的鎖操作,舉個例子:
public class Counter { private int count = 0; private Lock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } public int getCount() { lock.lock(); try { return count; } finally { lock.unlock(); } } }
在這個例子中,我們創建了一個可重入鎖對象,并對Counter類中的increment()和getCount()方法進行了加鎖和解鎖操作,保證了線程之間的協調和有序訪問共享資源。