MST
星途 面试题库

面试题:并发与同步之读写锁基础应用

在一个多线程环境中,有多个线程需要读取一个共享数据结构,偶尔会有一个线程需要写入该数据结构。请描述如何使用读写锁来实现高效的并发控制,简单说明读写锁在这种场景下的工作原理,并给出一个简单的伪代码示例。
23.9万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

读写锁实现高效并发控制的方式

  1. 读操作: 多个线程可以同时进行读操作,因为读操作不会修改共享数据,所以不会产生数据不一致问题。读写锁允许同时有多个读线程获取读锁。
  2. 写操作: 写操作会改变共享数据,为了保证数据一致性,在写操作时,不允许其他线程进行读或写操作。所以写线程获取写锁时,必须独占该锁。

读写锁工作原理

  1. 读锁: 当一个线程请求读锁时,如果当前没有写锁被持有,且没有写线程在等待写锁,那么该线程可以获取读锁。多个读线程可以同时持有读锁。
  2. 写锁: 当一个线程请求写锁时,如果当前没有读锁或写锁被持有,那么该线程可以获取写锁。如果有读锁或写锁被持有,写线程需要等待直到所有读锁被释放且没有其他写线程竞争写锁。

伪代码示例

// 定义读写锁
ReadWriteLock rwLock;

// 读操作
void readData() {
    rwLock.readLock().lock();
    try {
        // 读取共享数据结构的代码
    } finally {
        rwLock.readLock().unlock();
    }
}

// 写操作
void writeData() {
    rwLock.writeLock().lock();
    try {
        // 写入共享数据结构的代码
    } finally {
        rwLock.writeLock().unlock();
    }
}

在上述伪代码中,ReadWriteLock 是一个抽象的读写锁类型,readLock()writeLock() 分别获取读锁和写锁。lock() 方法用于获取锁,unlock() 方法用于释放锁。在实际编程中,不同的编程语言有不同的读写锁实现,如Java中的 ReentrantReadWriteLock 等。