为什么我们需要一个java锁才能阅读?

时间:2013-08-12 20:27:28

标签: locking java-5

W.r.t ReadWriteLock,为什么我需要一个锁,而我只是想读一些东西? 锁定我的知识只有在我改变变量时才使用,而不是读取它以避免并发线程试图改变变量。那么为什么我们需要一个只读的锁?

2 个答案:

答案 0 :(得分:5)

ReaderWriterLock的目的是确保在您阅读时没有其他线程会改变某些内容。

锁的读取部分不是独占的(可以有多个并发读取器),但写入部分除外(读者将等待写入器,反之亦然)。

答案 1 :(得分:1)

某些类型的对象封装了可变状态的多个方面,这些方面预计会彼此有一些关系。例如,List可能具有Count属性以及一堆编号的插槽。假设一个列表开始包含100个项目,并且一个线程试图枚举它们。在枚举线程到达项目50的时候,另一个线程试图在25号之前插入一个项目。应该发生什么?

如果枚举线程在启动之前获取了读锁定令牌,并在完成时释放它,并且想要插入项目的线程首先获取写锁定令牌,则枚举线程获取读取的事实-lock令牌将阻止更新线程修改列表,直到枚举完成。请注意,可以同时运行任意数量的枚举线程而不会发生任何冲突,但是在对列表进行任何更改之前,所有这些线程都必须完成(释放其读锁令牌)。请注意,一旦发出了写锁定令牌请求,读取锁定令牌的请求将被延迟,直到发出和释放写锁定令牌为止;如果没有这样做,稳定的读取请求流可能会阻止任何写入请求被发出。