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

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

ReadWriteLock讀寫之間互斥嗎?

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

好口碑IT培訓(xùn)

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

  下面是一個(gè)Java代碼演示,展示了ReadWriteLock的使用來實(shí)現(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();
    }
}

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

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

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

0 分享到:
和我們?cè)诰€交談!