java - 循环处理语句错误

标签 java

public static void main(String[] args) throws IOException {

   // new fetchEmailID().fetchIDs();
    new UserInputAndDefaulValues().validateUserInputAndDefaultValues();
    while(!UserInputAndDefaulValues.start_mailing_flag)
    {
        //System.out.println(UserInputAndDefaulValues.start_mailing_flag);

    }
    MainExecutor.main_executor();
}

当我取消注释时

//System.out.println(UserInputAndDefaulValues.start_mailing_flag);

while 循环中的条件正确工作并且 while 循环在 false 条件下结束。但正如我评论的那样,循环进入无限循环,即使它应该逃脱。为什么只有一个输出语句会出现这种行为?

最佳答案

首先,您的代码没有正确同步。换句话说,它在 start_mailing_flag 上包含一个数据竞争

现在,PrintStream#println 方法是同步的,因此调用它会强制 JIT 编译器避免某些优化(即 提升)有问题的代码。一旦删除该语句,效果就消失了。

总而言之,当您取消对 println 的注释时,您的代码纯属偶然并且作为调用同步方法的副作用.它仍然像以前一样是线程不安全的。

关于java - 循环处理语句错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20869782/

相关文章:

java - 摆脱 Eclipse 中烦人的警告

java - ExecutorService.execute() 不返回线程类型

java - 如何在maven中从外部jar复制资源?

java - 根据不同的参数将集合(使用 java 8 流)拆分为更小的组件

java - 如何双重转义双引号?

java - ArrayLists 值在 Get() 调用时返回 Null 的 HashMap

java - JavaFX2 最终会取代 Swing 吗?

Java 线程被通知调用卡住了

java - 如何通过yarnClient在代码中获取日志聚合

java - 在java中将按位运算符分配给变量