教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

ReadWriteLock读写之间互斥吗?

更新时间:2023年05月25日09时45分 来源:传智教育 浏览次数:

好口碑IT培训

  是的,ReadWriteLock(读写锁)提供了读写之间的互斥。它是一种并发控制机制,允许多个线程同时读取共享数据,但只允许一个线程写入共享数据。

  下面是一个Java代码演示,展示了ReadWriteLock的使用来实现读写互斥:

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++;  // 修改共享数据
                    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();
    }
}

  在上面的示例中,有一个共享的数据变量sharedData,一个写线程和一个读线程。写线程通过获取写锁来修改共享数据,而读线程通过获取读锁来读取共享数据。

  运行上述代码后,你会看到写线程定期地更新共享数据,并打印出更新后的值,而读线程会定期地读取共享数据并打印出当前的值。由于使用了ReadWriteLock,读写操作是互斥的,即在写操作进行时,读操作将被阻塞,直到写操作完成。这保证了数据的一致性和正确性。

  笔者以上只是做了一个简单的演示,实际使用ReadWriteLock可能涉及更复杂的逻辑和多个读写线程。

0 分享到:
和我们在线交谈!