java - 通过不同线程同时读取和更改变量

标签 java multithreading concurrency thread-safety thread-synchronization

我对 一个线程正在等待 while 循环中的变量变化的情况感兴趣:

while (myFlag == false) {
    // do smth
}

它重复了无数次。

同时,另一个线程改变了这个变量的值:

myFlag = true;

如果这个变量不是易变的,读者线程能否看到在另一个线程中更改变量值的结果?一般来说,据我所知,它永远不会发生。还是我错了?那么什么时候、什么情况下,第一个线程才能看到变量的变化而退出循环呢?这可能不使用 volatile 关键字吗?处理器缓存的大小在这种情况下是否起作用?

请解释并帮助我理解!提前致谢!!

最佳答案

Can the reader-thread see the result of changing the value of the variable in the other thread if this variable is NOT volatile?

可能能够,是的。只是它肯定不会看到变化。

In general, as I understand it will never happen.

不,不是这样的。

您正在写入一个变量,然后在另一个线程中从中读取。您是否看到它取决于所涉及的确切处理器和内存架构。在不涉及任何内存障碍的情况下,您不能保证看到新值 - 但您当然也不能保证不会看到它。

关于java - 通过不同线程同时读取和更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19104146/

相关文章:

c# - 用于检查线程安全的自动化 .NET 工具?

multithreading - Windows Azure 辅助角色内的最大并发线程数

objective-c - 如果我打算稍后优化并发性,我应该如何在 Cocoa 中设计通知?

Php - Insert Autoincrement Value - For Parent/Child Tables - 并发问题

java - 在 Sling 中映射过滤器和 servlet

java - 使用 BufferedReader 跳过一行(跳过,但不读取)

c# - 确定从转储文件中抛出异常的线程

c++ - 一旦可用就获取锁

java - 链表以一种数据类型显示数据

java - 如何通过android连接SMSC模拟器?