Thread詳解15:ReentrantReadWriteLock

這裏寫圖片描述

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestReentrantReadWriteLock extends Thread {
    private ReentrantReadWriteLock readWriteLock;
    private ArrayList<Integer> aList;
    private String name;

    public TestReentrantReadWriteLock(ReentrantReadWriteLock readWriteLock, ArrayList<Integer> aList, String name) {
        super(name);
        this.readWriteLock = readWriteLock;
        this.aList = aList;
        this.name = name;
    }

    @Override
    public void run() {
        super.run();

        if (name.startsWith("Read")) {
            readWriteLock.readLock().lock();
            try {
                for (int i = 0; i < 3; i++) {
                    System.out.printf(Thread.currentThread().getName() + " red: [%d];\n", aList.get(0));
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                readWriteLock.readLock().unlock();
            }
        }
        if (name.startsWith("Write")) {
            readWriteLock.writeLock().lock();
            try {
                for (int i = 0; i < 3; i++) {
                    Random random = new Random();
                    int value = random.nextInt(100);
                    aList.set(0, value);
                    System.out.println(Thread.currentThread().getName() + " wrote: " + value);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                readWriteLock.writeLock().unlock();
            }
        }
    }

    public static void main(String[] args) {
        ArrayList<Integer> aList = new ArrayList<>();
        aList.add(0);
        ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

        TestReentrantReadWriteLock r1 = new TestReentrantReadWriteLock(readWriteLock, aList, "Read1");
        TestReentrantReadWriteLock r2 = new TestReentrantReadWriteLock(readWriteLock, aList, "Read2");
        TestReentrantReadWriteLock w1 = new TestReentrantReadWriteLock(readWriteLock, aList, "Write1");
        TestReentrantReadWriteLock w2 = new TestReentrantReadWriteLock(readWriteLock, aList, "Write2");
        r1.start();
        r2.start();
        w1.start();
        w2.start();
    }

}

輸出

Read1 red: [0];
Read2 red: [0];
Read2 red: [0];
Read1 red: [0];
Read2 red: [0];
Read1 red: [0];
Write1 wrote: 58
Write1 wrote: 63
Write1 wrote: 64
Write2 wrote: 23
Write2 wrote: 13
Write2 wrote: 70

可見,確實是讀鎖是併發的,交叉地在執行;寫鎖是同步的,串行化地在執行。然後讀鎖和寫鎖是互斥的,在同一時間,要麼讀,要麼寫,不能一邊寫一邊讀。

發佈了66 篇原創文章 · 獲贊 15 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章