更新時(shí)間:2023年05月29日09時(shí)43分 來(lái)源:傳智教育 瀏覽次數(shù):
是的,ReadWriteLock(讀寫(xiě)鎖)提供了讀寫(xiě)操作之間的互斥。它允許多個(gè)線(xiàn)程同時(shí)進(jìn)行讀操作,但在寫(xiě)操作期間會(huì)阻塞其他線(xiàn)程的讀和寫(xiě)操作。
接下來(lái)筆者通過(guò)一段具體的Java代碼,來(lái)具體演示一下ReadWriteLock讀寫(xiě)互斥的原理:
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockDemo { private static final ReadWriteLock lock = new ReentrantReadWriteLock(); private static int sharedData = 0; public static void main(String[] args) { Thread writerThread = new Thread(() -> { while (true) { lock.writeLock().lock(); // 獲取寫(xiě)鎖 try { sharedData++; // 修改共享數(shù)據(jù) System.out.println("Writer thread modified data: " + sharedData); Thread.sleep(1000); // 模擬寫(xiě)操作的耗時(shí) } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); // 釋放寫(xiě)鎖 } } }); Thread readerThread = new Thread(() -> { while (true) { lock.readLock().lock(); // 獲取讀鎖 try { System.out.println("Reader thread read data: " + sharedData); // 讀取共享數(shù)據(jù) Thread.sleep(500); // 模擬讀操作的耗時(shí) } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); // 釋放讀鎖 } } }); writerThread.start(); readerThread.start(); } }
在以上示例中,有一個(gè)共享的整數(shù)變量sharedData,一個(gè)寫(xiě)線(xiàn)程負(fù)責(zé)修改它的值,一個(gè)讀線(xiàn)程負(fù)責(zé)讀取它的值。
在寫(xiě)線(xiàn)程中,我們首先獲取寫(xiě)鎖lock.writeLock().lock(),然后進(jìn)行寫(xiě)操作并修改共享數(shù)據(jù),最后釋放寫(xiě)鎖lock.writeLock().unlock()。
在讀線(xiàn)程中,我們首先獲取讀鎖lock.readLock().lock(),然后進(jìn)行讀操作并打印共享數(shù)據(jù),最后釋放讀鎖lock.readLock().unlock()。
讀線(xiàn)程和寫(xiě)線(xiàn)程都會(huì)一直運(yùn)行,并通過(guò)鎖的機(jī)制實(shí)現(xiàn)讀寫(xiě)互斥。
北京校區(qū)