W.r.t ReadWriteLock,为什么我在尝试读取某些内容时需要锁?只有当我正在变异一个变量时,才使用锁定我的知识,而不是读取它,以避免并发线程试图变异变量。那么,为什么我们需要一个只用于阅读的锁呢?
ReaderWriterLock的目的是确保在您读取某个内容时,没有其他线程对其进行更改。
锁的读取部分不是独占的(可以有多个并发读取器),写入部分除外(读取器将等待写入器,反之亦然)。
某些类型的对象封装了可变状态的多个方面,这些方面预计彼此之间存在某种关系。例如,List
可以具有Count
属性以及一组编号的时隙。假设一个列表一开始包含100个项目,并且一个线程试图枚举它们。大约在枚举线程到达项目50时,另一个线程尝试在数字25之前插入一个项目。该怎么办?
如果枚举线程在启动之前获取了读锁定令牌,并在完成后释放它,并且想要插入项的线程首先获取了写锁定令牌,则枚举线程获取读锁定令牌这一事实将阻止更新线程修改列表,直到枚举完成。请注意,可以让任意数量的枚举线程同时运行而不发生任何冲突,但在对列表进行任何更改之前,所有这些线程都必须完成(释放其读锁令牌)。请注意,一旦发出写锁定令牌请求,对读锁定令牌的请求将被推迟到写锁定令牌被发出和释放之后;如果不这样做,稳定的读请求流可能会阻止任何写请求的发出。