Java中同步和鎖問題是開發過程中常見的問題。在多線程并發執行的場景下,需要保證共享的資源只能被一個線程訪問,否則會導致數據的不一致性和線程安全問題。
Java提供了多種同步機制,其中最常用的就是synchronized關鍵字。
public synchronized void print(){ //do something }
在synchronized關鍵字修飾的方法中,同一時刻只能有一個線程執行該方法,其他線程只能等待。這樣可以保證線程安全,但是在高并發場景下會導致性能問題。
為了優化性能,可以使用鎖來實現同步。Java提供了兩種鎖:ReentrantLock和ReadWriteLock。
ReentrantLock是可重入鎖,支持手動加鎖和解鎖,使用起來比較靈活,但是需要注意死鎖等問題。
private final ReentrantLock lock = new ReentrantLock(); public void print(){ lock.lock(); try{ //do something }finally{ lock.unlock(); } }
ReadWriteLock是讀寫鎖,適用于讀多寫少的場景。該鎖允許多個線程同時讀取共享資源,但是只允許一個線程寫入共享資源。
private final ReadWriteLock lock = new ReentrantReadWriteLock(); public void read(){ lock.readLock().lock(); try{ //do something }finally{ lock.readLock().unlock(); } } public void write(){ lock.writeLock().lock(); try{ //do something }finally{ lock.writeLock().unlock(); } }
在使用鎖時需要注意鎖的粒度,應該盡量縮小鎖的范圍,以減少等待鎖的線程數量。