【问题标题】:java eclipse, boolean value goes wrongjava eclipse,布尔值出错
【发布时间】:2014-03-04 06:26:33
【问题描述】:

我在 Main.java 和一个布尔字段 Main.bool 上运行了两个线程,该字段在开始时为 false。 第一个线程将 Main.bool 设置为 true。 之后,第二个线程将打印出 Main.bool。结果是FALSE

更有趣的是,我尝试在打印 Main.bool 之前打印出一个随机文本,结果结果是正确的(true)。

有人知道这里发生了什么吗?我正在使用日食开普勒。

Main.bool = false;
thread1.setBool(true);
// then wait for some seconds
// case 1
thread2.printBool(); --> false
// case 2
System.out.println("blah blah");
thread2.printBool(); --> true

【问题讨论】:

  • 让你的领域volatile
  • 在处理多线程时使用 volatile 字段使其同步
  • 当您有多个线程时,无法保证线程执行的顺序。它们将以任意方式轮换执行。因此,thread2 可能会在 thread1 更改值之前打印出布尔值。
  • 不,不是,我确保线程 1 发生在线程 2 之前。

标签: java eclipse boolean


【解决方案1】:

将您归档的 'bool' 设为 volatile。

对 volatile 变量的任何写入都会与对同一变量的后续读取建立之前发生的关系

了解更多info

注意:使字段易失,确保读取该字段值的任何人都从内存中读取它,而不是从本地副本中读取。

【讨论】:

  • 是的,谢谢,我确实知道 volatile 字段,但我只是不明白为什么会这样,您的答案似乎是正确的:)
【解决方案2】:

表格JLS-8.3.1.4

Java 编程语言提供了第二种机制,即 volatile 字段,在某些情况下它比锁定更方便。

一个字段可能被声明为 volatile,在这种情况下,Java 内存模型确保所有线程都能看到变量的一致值

更多详情见:

  1. Atomic Access
  2. What are Transient and Volatile Modifiers

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2017-07-07
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多