Java中的Lock接口提供了兩種不同的鎖類型:獨占鎖(Exclusive Lock,也叫做寫鎖)和共享鎖(Shared Lock,也叫做讀鎖)。這兩種鎖的實現方式有所不同,其中,獨占鎖通常使用的是ReentrantLock,而共享鎖通常使用的是ReadLock。
ReentrantLock是一個可重入獨占鎖,它的實現方式是輪詢式,即在競爭鎖的時候會重復地嘗試獲取鎖。當一個線程獲取了ReentrantLock的鎖后,在持有鎖的情況下還可以繼續獲取鎖,這就是所謂的可重入性。在使用ReentrantLock實現互斥鎖的時候,需要使用lock和unlock方法來獲取和釋放鎖。
public class ReentrantLockDemo { private final ReentrantLock lock = new ReentrantLock(); public void demo() { lock.lock(); try { // do something } finally { lock.unlock(); } } }
ReadLock是一個共享鎖,它的實現方式是非競爭式的,即在獲取鎖的時候不會阻塞其他線程的讀取操作。當一個線程獲取了ReadLock的鎖后,在持有鎖的情況下還可以繼續獲取鎖,這就是所謂的可重入性。在使用ReadLock實現共享鎖的時候,需要使用readLock和unlock方法來獲取和釋放鎖。
public class ReadLockDemo { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void demo() { lock.readLock().lock(); try { // do something } finally { lock.readLock().unlock(); } } }
需要注意的是,使用共享鎖的時候需要考慮鎖的粒度。如果使用了過大的粒度,會導致鎖的等待時間過長,影響并發性能;如果使用了過小的粒度,會導致鎖的數量過多,增加了資源消耗。
上一篇vue拍美食視頻
下一篇java io和tcp