gpt4 book ai didi

java - 线程的多线程访问和变量缓存

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:44:32 25 4
gpt4 key购买 nike

如果我阅读有关多线程的完整章节/书籍,我可以找到答案,但我想要一个更快的答案。 (我知道 this stackoverflow 问题类似,但还不够。)

假设有这个类:

public class TestClass {
private int someValue;

public int getSomeValue() { return someValue; }
public void setSomeValue(int value) { someValue = value; }
}

有两个线程(A 和 B)访问这个类的实例。考虑以下顺序:

  1. A: getSomeValue()
  2. B: setSomeValue()
  3. A: getSomeValue()

如果我是对的,someValue 必须是可变的,否则第 3 步可能不会返回最新值(因为 A 可能有缓存值)。这是正确的吗?

第二种情况:

  1. B: setSomeValue()
  2. A: getSomeValue()

在这种情况下,A 总是会得到正确的值,因为这是它的第一次访问,所以他还没有缓存值。这样对吗?

如果以第二种方式访问一个类,就不需要volatile/synchronization,是吗?

注意这个例子是简化的,实际上我想知道复杂类中的特定成员变量和方法,而不是整个类(即哪些变量应该是可变的或具有同步访问).要点是:如果更多线程访问某些数据,是否一定需要同步访问,还是取决于它们访问它的方式(例如顺序)?


看完评论后,我试着用另一个例子来说明我困惑的根源:

  1. 来自 UI 线程:threadA.start()
  2. threadA 调用getSomeValue(),并通知UI线程
  3. UI 线程获取消息(在其消息队列中),因此它调用:threadB.start()
  4. threadB 调用setSomeValue(),并通知UI线程
  5. UI线程获取消息,并通知线程A(以某种方式,例如消息队列)
  6. threadA 调用 getSomeValue()

这是一个完全同步的结构,但为什么这意味着线程 A 将在第 6 步中获取最新值? (如果 someValue 不是易变的,或者在从任何地方访问时都没有放入监视器)

最佳答案

如果两个线程正在调用相同的方法,则您无法保证所述方法的调用顺序。因此,您的原始前提(取决于调用顺序)是无效的。

这与调用方法的顺序无关;这是关于同步。它是关于使用某种机制让一个线程等待,而另一个完全完成其写入操作。一旦您决定拥有多个线程,您必须提供避免数据损坏的同步机制。

关于java - 线程的多线程访问和变量缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com