当前位置: 首页 > 面试题库 >

Java线程可见性

缑永年
2023-03-14
问题内容

当我阅读“ 实践中的Java并发性 ” c03时,我对以下程序感到困惑:

public class NoVisibility { 
    private static boolean ready; 
    private static int number;

    private static class ReaderThread extends Thread { 
        public void run() { 
            while (!ready) 
                Thread.yield(); 
            System.out.println(number); 
        } 
    }

    public static void main(String[] args) { 
        new ReaderThread().start(); 
        number = 42; 
        ready = true; 
    } 
}

由于重新排序和线程可见性,循环可能永远不会停止,或者输出可能为零,但是我已经尝试了很多次,并且输出始终为42。所有原因是我太幸运了吗?


问题答案:

所有的原因是我太幸运了吗?

不必要。这也将取决于您的处理器体系结构和JVM实现。那就是微妙的内存模型问题的问题之一:它们很难在野外复制。



 类似资料:
  • 问题内容: 如果从多个线程访问Java中的变量,则必须确保安全发布它们。这通常意味着使用或。 我的印象是,我的一些同事没有认真对待这个问题,因为他们“从未听说过,他们的程序已经工作了很多年”。 所以我的问题是: 有人可以提供一个示例Java程序/片段来可靠地显示数据可见性问题。 我认为运行程序并看到意外的NPE或过时的变量值会比理论上的解释更有帮助,这是无法证明的。 非常感谢你的帮助! 更新: 只

  • 我正在学习Java的易失性,我的代码是这样的。 我知道如果flag没有volatile,线程就不会存在。这是能见度的问题。 但是,如果我在while循环中编写一些代码,如,t1线程将读取新值并停止循环。 我知道如何使用volatile来解决可见性问题,所以我的问题是: 为什么当我写?

  • 我写了这段代码,一个阻塞队列的实现: 1.我尝试创建两个线程,并强制它们向队列中添加一些数字,然后将其删除。不幸的是,似乎每个线程都有自己的对象。如何更改代码,使两个线程都处理同一对象,并同步向同一阻塞队列添加/删除? 2.我是否正确地编写了出队列函数(这样,当一个线程从队列中删除最后一个数字并且队列大小现在为零时,其他线程将等待队列通知它们)? 这是我的测试器: 这是输出:

  • 问题内容: 根据: http://www.ibm.com/developerworks/library/j-jtp03304/ 在新的内存模型下,当线程A写入易失性变量V,并且线程B从V读取时,现在保证了在写入V时A可见的任何变量值对B可见。 互联网上的许多地方都指出,以下代码永远不应显示“错误”: 应 当为1,所有的线程是1。 但是 有时我会打印“错误” 。这怎么可能? 问题答案: 更新: 对于

  • 在我的测试用例中,我有一个事务方法,它创建用户,然后在从数据库检索该用户的不同线程中调用异步方法。在下面的代码中,在db中找不到用户,dao返回null。如何确保不同线程的数据都在那里?冲洗似乎没有帮助。我需要手动提交吗?将隔离级别设置为READ_Uncommitted也没有帮助。 交易服务

  • 如何从线程池中找到60%(或N%)的线程可用性?这背后的逻辑是什么? 父线程使用线程池线程生成多个网址,并等待所有子线程完成。 代码如下所示 父线程 子线程 用于跨线程通信的对象数据 在上述代码中,所需的线程硬编码为: 这种硬编码会导致线程池不足吗?如果线程池中没有可用的线程,会发生什么?如何在托管服务器的线程池中查找可用线程的总数? 谢谢。