如果我阅读有关多线程的完整章节/书籍,我可以找到答案,但我想要一个更快的答案。(我知道这个stackoverflow 问题很相似,但还不够。)
假设有这个类:
public class TestClass {
private int someValue;
public int getSomeValue() { return someValue; }
public void setSomeValue(int value) { someValue = value; }
}
有两个线程(A 和 B)访问这个类的实例。考虑以下顺序:
- 答:getSomeValue()
- B:setSomeValue()
- 答:getSomeValue()
如果我是对的, someValue 必须是易失的,否则第三步可能不会返回最新值(因为 A 可能有缓存值)。它是否正确?
第二种情况:
- B:setSomeValue()
- 答:getSomeValue()
在这种情况下,A 总是会得到正确的值,因为这是它的第一次访问,所以他还没有缓存值。这是正确的吗?
如果仅以第二种方式访问一个类,则不需要 volatile/synchronization,或者是吗?
请注意,此示例已简化,实际上我想知道复杂类中的特定成员变量和方法,而不是整个类(即哪些变量应该是可变的或具有同步访问权限)。要点是:如果更多线程访问某些数据,是否需要同步访问,还是取决于它们访问它的方式(例如顺序)?
阅读评论后,我尝试用另一个例子来说明我的困惑的根源:
- 从 UI 线程:
threadA.start()
- threadA 调用
getSomeValue()
,并通知 UI 线程 - UI 线程获取消息(在其消息队列中),因此它调用:
threadB.start()
- threadB 调用
setSomeValue()
,并通知 UI 线程 - UI 线程获取消息,并通知线程A(以某种方式,例如消息队列)
- 线程A调用
getSomeValue()
这是一个完全同步的结构,但为什么这意味着 threadA 将在第 6 步中获得最新的值?(如果someValue
不是易失性的,或者从任何地方访问时都没有放入监视器)