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

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

ReadWriteLock讀寫(xiě)之間互斥嗎?

更新時(shí)間:2023年05月29日09時(shí)43分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  是的,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ě)互斥。

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