【发布时间】:2012-07-01 10:54:01
【问题描述】:
如果我阅读有关多线程的完整章节/书籍,我可以找到答案,但我想要一个更快的答案。 (我知道this 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 必须是 volatile,否则第三步可能不会返回最新值(因为 A 可能有缓存值)。这是正确的吗?
第二种情况:
- B:setSomeValue()
- 答:getSomeValue()
在这种情况下,A 将始终获得正确的值,因为这是它的第一次访问,所以他还不能获得缓存值。是这样吗?
如果以第二种方式仅访问一个类,就不需要volatile/synchronization,是吗?
请注意,此示例已简化,实际上我想知道复杂类中的特定成员变量和方法,而不是整个类(即哪些变量应该是易失的或具有同步访问权限)。要点是:如果更多线程访问某些数据,是否需要同步访问,还是取决于它们访问它的方式(例如顺序)?
在阅读了 cmets 之后,我尝试用另一个例子来说明我的困惑的根源:
- 来自 UI 线程:
threadA.start() - threadA调用
getSomeValue(),并通知UI线程 - UI 线程获取消息(在其消息队列中),因此它调用:
threadB.start() - threadB 调用
setSomeValue(),并通知UI线程 - UI 线程获取消息,并通知线程A(以某种方式,例如消息队列)
- threadA 调用
getSomeValue()
这是一个完全同步的结构,但为什么这意味着 threadA 将在第 6 步中获得最新的值? (如果someValue 不是易失性的,或者从任何地方访问时都没有放入监视器)
【问题讨论】:
标签: java android multithreading volatile