如果线程只读取变量并且没有人写入它(不是其中一个线程,而不是其他人),那么没有锁定就完全没问题.如果可能发生任何并发修改,那么每个人(包括纯读者)必须以某种方式同步 - 通过互斥锁,读/写锁或其他方式.
通常,需要独占访问以防止看到不一致的状态。对于读取器线程,这意味着避免部分读取。
这意味着什么 ?想象一下,您有一个存储在两个(原子)整数上的值,例如坐标。
int i = 3;
int j = 4;
Run Code Online (Sandbox Code Playgroud)
现在,我们将阅读i并j在它们进行修改时,更准确地说,当Writer线程想要以对角线方式从 移动(3, 4)到 时(4, 5):
Reader Writer
| |
| i = 4
| |
i = 4 <pause>
j = 4 |
| j = 5
| |
Run Code Online (Sandbox Code Playgroud)
这称为部分读取:Reader线程获得了对象所在的信息,(4, 4)即使它从未存在过。我会让你想想如果这些坐标用于计算平面的轨迹会发生什么......
然而,避免部分读取相当容易:应该以原子方式查看突变。
因此,为了回答您的问题,如果唯一的访问是读访问,则不需要同步。但是如果您有时(甚至很少)修改读取的信息,那么您需要某种机制。