java - 两个并行线程可以异步执行静态 block 吗

标签 java static

我有以下代码。

在任何时间点,i 的打印值是否仍为 0。 对于上述执行,我无法重现它。但在生产代码中我得到的值是 0。

我有一个带有静态初始化 block 的生产代码。不知何故,其中一个方法会在静态 block 完成执行之前执行。

class TestStatic {

    private int i = 0;

    public static TestStatic testStatic = null;

    static {
        testStatic = new TestStatic();
        try {
            BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\I338224\\Documents\\temp\\src\\Test.xml"));
            final StringBuilder builder = new StringBuilder();
            final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            docBuilderFactory.setIgnoringElementContentWhitespace(true);
            docBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            DocumentBuilder docBuilder = null;
            docBuilder = docBuilderFactory.newDocumentBuilder();
            for(long i=0;i<1000000000;i++);
            Document d = docBuilder.parse("C:\\Users\\I338224\\Documents\\temp\\src\\Test.xml");
            reader.lines().forEach(line -> builder.append(line).append("\n"));
            System.out.println(builder.length());
            testStatic.i = 5;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
    }

    public static TestStatic getInstance(){
        return testStatic;
    }

    public void display(){
        System.out.println(i);
    }
}

public class Test {

    public static void main(String[] args) {

        Runnable r = () -> {
            TestStatic.getInstance().display();
        };
        Runnable r2 = () -> {
            TestStatic.getInstance().display();
        };
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r2);
        t1.start();
        t2.start();
    }
}

预期的结果是 i 打印的值应该是 5。但实际上是 0。

最佳答案

以下是mcve您的代码。
如果您取消注释 if(true) throw new IllegalStateException("Exception");:

,它会打印 0
import java.util.concurrent.TimeUnit;

class TestStatic {

    private int i = 0;
    public static TestStatic testStatic = null;

    static {
        testStatic = new TestStatic();
        try {
            TimeUnit.SECONDS.sleep(1);
            //if(true) throw new IllegalStateException();
            testStatic.i = 5;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static TestStatic getInstance(){
        return testStatic;
    }

    public void display(){
        System.out.println(i);
    }
}

public class Test {

    public static void main(String[] args) {
        new Thread(() -> TestStatic.getInstance().display()).start();
        new Thread(() -> TestStatic.getInstance().display()).start();
    }
}

关于java - 两个并行线程可以异步执行静态 block 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57218549/

相关文章:

java - 多个具有相同 log4j 的 weblogic 受管节点会导致文件锁定吗?

java - 给定一个 java 类的 Web 服务架构

java - 在我刷新页面 Spring Mvc 之前,上传的图像不会显示

java - 如何实现带有超时的 Runnable?

java - 私有(private)静态类和 CursorLoader

c - 重构全局到局部。它们是否应该是静态的?

java - 以全大写形式声明记录器并将其定为最终版本有什么区别吗?

多次调用的 C++ 静态成员析构函数

php - 使用类作为命名空间

java - 将用于连接的对象实例变量设置为静态或非静态更好吗