Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,运行main的线程必须与静态内容初始化的线程相同吗?_Java_Multithreading_Jvm Hotspot - Fatal编程技术网

在Java中,运行main的线程必须与静态内容初始化的线程相同吗?

在Java中,运行main的线程必须与静态内容初始化的线程相同吗?,java,multithreading,jvm-hotspot,Java,Multithreading,Jvm Hotspot,事实上,我只关心热点7/8/9,但了解其他热点也很好 是否允许我执行以下操作并始终希望打印输出: public class Main { static final PrintStream MY_THREAD_LOCAL_PS = new MySpecialPS(); public static void main(String... args) { System.setOut(MY_THREAD_LOCAL_PS); System.out.pri

事实上,我只关心热点7/8/9,但了解其他热点也很好

是否允许我执行以下操作并始终希望打印输出:

public class Main {
    static final PrintStream MY_THREAD_LOCAL_PS = new MySpecialPS();

    public static void main(String... args) {
        System.setOut(MY_THREAD_LOCAL_PS);
        System.out.println("/Me written!");
    }
}

MySpecialPS只允许从调用其构造函数的线程进行写操作(例如,构造函数中的线程本地布尔值设置为true)。

通常,您可以确信,在访问任何静态成员之前,一个类将由一个线程初始化,调用其任何静态方法,或者它是实例化的。但是,您不能确信第一个执行这些操作的线程将是初始化类的线程

应用程序的主类当然有点特殊,但据我所知,语言规范或VM规范中的任何内容都不能保证该类将由稍后调用其
main()
方法的同一线程初始化。从这个意义上说,假设像您建议的那样的Java程序会成功地发出任何输出是不安全的


当然,您可以针对此行为测试现有VM。我假设您通过这种方式发现的内容在每个VM实现中都是一致和可靠的。但是,我建议您即使在测试之后也不要依赖这些未指定的实现细节。无论您想做什么,都要找到另一种方法。

实际上,这是启动器的属性,甚至不是JVM的属性。可以使用相同的JVM实现编写一个显示不同行为的替代启动器…