与Java 7不兼容

时间:2012-10-10 01:15:45

标签: multithreading java-7 volatile java-6 incompatibility

对于我的生活,我无法弄清楚为什么这个程序在Java 7中不起作用。我在运行它时没有使用Java 6的问题,但是一旦我用Java 7运行它,它就没有了工作。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class HelloWorld implements ActionListener {

JButton button;
boolean state;

public HelloWorld(){
    init();
    state = false;
    System.out.println("state - "+state);

    while (true){
        if (state == true){
            System.out.println("Success");
        }
    }
}

private void init(){
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    button = new JButton("Button");
    button.addActionListener(this);
    frame.add(button);
    frame.pack();
    frame.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
    JButton source = (JButton)e.getSource();

    if (source == button){
        state = !state;
        System.out.println("state - "+state);
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    new HelloWorld();
}

}

使用Java 6,如果我按下按钮,它将打印出短语“Success”,直到我再次点击按钮。使用Java 7注册按下按钮并将状态值更改为true,但永远不会打印短语“Success”。发生了什么事?

2 个答案:

答案 0 :(得分:4)

volatile添加到字段声明中。

如果没有volatile,则无法保证字段中的更改在其他线程上可见 特别是,JITter可以自由地相信该字段永远不会在主线程上发生变化,从而允许它完全删除if

答案 1 :(得分:0)

当您显示JFrame

 frame.setVisible(true); 

Java显示窗口并停止此行的执行。

您将窗口配置为在关闭时退出:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

关闭窗口后,此程序将终止。

因此init()调用后的代码永远不会被执行。