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

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

ReadWriteLock讀寫之間互斥嗎?

更新時間:2023年05月25日09時45分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓

  是的,ReadWriteLock(讀寫鎖)提供了讀寫之間的互斥。它是一種并發(fā)控制機制,允許多個線程同時讀取共享數(shù)據(jù),但只允許一個線程寫入共享數(shù)據(jù)。

  下面是一個Java代碼演示,展示了ReadWriteLock的使用來實現(xiàn)讀寫互斥:

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockExample {
    private static int sharedData = 0;
    private static ReadWriteLock lock = new ReentrantReadWriteLock();

    public static void main(String[] args) {
        Thread writerThread = new Thread(() -> {
            while (true) {
                try {
                    lock.writeLock().lock();  // 獲取寫鎖
                    sharedData++;  // 修改共享數(shù)據(jù)
                    System.out.println("Writer: Data updated to " + sharedData);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.writeLock().unlock();  // 釋放寫鎖
                }
            }
        });

        Thread readerThread = new Thread(() -> {
            while (true) {
                try {
                    lock.readLock().lock();  // 獲取讀鎖
                    System.out.println("Reader: Data read as " + sharedData);
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.readLock().unlock();  // 釋放讀鎖
                }
            }
        });

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

  在上面的示例中,有一個共享的數(shù)據(jù)變量sharedData,一個寫線程和一個讀線程。寫線程通過獲取寫鎖來修改共享數(shù)據(jù),而讀線程通過獲取讀鎖來讀取共享數(shù)據(jù)。

  運行上述代碼后,你會看到寫線程定期地更新共享數(shù)據(jù),并打印出更新后的值,而讀線程會定期地讀取共享數(shù)據(jù)并打印出當前的值。由于使用了ReadWriteLock,讀寫操作是互斥的,即在寫操作進行時,讀操作將被阻塞,直到寫操作完成。這保證了數(shù)據(jù)的一致性和正確性。

  筆者以上只是做了一個簡單的演示,實際使用ReadWriteLock可能涉及更復雜的邏輯和多個讀寫線程。

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