教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

ReadWriteLock讀寫之間互斥嗎?

更新時間:2023年05月29日09時43分 來源:傳智教育 瀏覽次數:

好口碑IT培訓

  是的,ReadWriteLock(讀寫鎖)提供了讀寫操作之間的互斥。它允許多個線程同時進行讀操作,但在寫操作期間會阻塞其他線程的讀和寫操作。

  接下來筆者通過一段具體的Java代碼,來具體演示一下ReadWriteLock讀寫互斥的原理:

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(); // 獲取寫鎖
                try {
                    sharedData++; // 修改共享數據
                    System.out.println("Writer thread modified data: " + sharedData);
                    Thread.sleep(1000); // 模擬寫操作的耗時
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.writeLock().unlock(); // 釋放寫鎖
                }
            }
        });

        Thread readerThread = new Thread(() -> {
            while (true) {
                lock.readLock().lock(); // 獲取讀鎖
                try {
                    System.out.println("Reader thread read data: " + sharedData); // 讀取共享數據
                    Thread.sleep(500); // 模擬讀操作的耗時
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.readLock().unlock(); // 釋放讀鎖
                }
            }
        });

        writerThread.start();
        readerThread.start();
    }
}

  在以上示例中,有一個共享的整數變量sharedData,一個寫線程負責修改它的值,一個讀線程負責讀取它的值。

  在寫線程中,我們首先獲取寫鎖lock.writeLock().lock(),然后進行寫操作并修改共享數據,最后釋放寫鎖lock.writeLock().unlock()。

  在讀線程中,我們首先獲取讀鎖lock.readLock().lock(),然后進行讀操作并打印共享數據,最后釋放讀鎖lock.readLock().unlock()。

  讀線程和寫線程都會一直運行,并通過鎖的機制實現讀寫互斥。

0 分享到:
和我們在線交談!