8、读写锁 ReadWriteLock

1、示例代码

public class SharedLockExample {

    private static ReadWriteLock lock = new ReentrantReadWriteLock();
    private static int sharedData = 0;

    public static void readData() {
        lock.readLock().lock();
        try {
            System.out.print(Thread.currentThread() + " ");
            System.out.println("Read data: " + sharedData);
        } finally {
            lock.readLock().unlock();
        }
    }

    public static void writeData(int data) {
        lock.writeLock().lock();
        try {
            sharedData = data;
            System.out.print(Thread.currentThread() + " ");
            System.out.println("Write data: " + sharedData);
        } finally {
            lock.writeLock().unlock();
        }
    }

    public static void main(String[] args) {
        // 创建多个读线程和一个写线程
        Thread writerThread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                writeData(i); // 写线程
            }
        });

        Thread readerThread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                readData(); // 读线程 1
            }
        });

        Thread readerThread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                readData(); // 读线程 2
            }
        });

        // 启动线程
        writerThread.start();
        readerThread1.start();
        readerThread2.start();

        // 等待线程执行完成
        try {
            writerThread.join();
            readerThread1.join();
            readerThread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2、解释

读锁是共享锁,写锁是排它锁,读锁和写锁之间也是排它的
读操作可以并发执行,写操作只能单独执行,写操作和读操作之间不行并发执行

读锁的目的是:确保在读取共享资源时,不会被其他线程的写操作所干扰
如果代码中只有读操作,而没有写操作,那么就不存在竞争条件,不会出现数据不一致的情况
在这种情况下,可以省略对共享资源的读锁获取和释放操作,从而减少锁的开销,提高程序的性能

读锁是共享锁,多个线程可以同时获取读锁,readerThread1 和 readerThread2 可以同时获取读锁,因此它们可以同时读取 sharedData 的值,而不会相互阻塞

posted @ 2023-06-18 12:04  lidongdongdong~  阅读(14)  评论(0编辑  收藏  举报