小编don*_*ata的帖子

线程之间是否共享静态变量?

我的老师在一个关于线程的上层Java课上说了一些我不确定的东西.

他表示以下代码不一定会更新ready变量.根据他的说法,两个线程不一定共享静态变量,特别是在每个线程(主线程对ReaderThread)在其自己的处理器上运行并因此不共享相同的寄存器/缓存/等和一个CPU的情况下不会更新另一个.

从本质上讲,他说有可能ready在主线程中更新,但不在主线程中更新ReaderThread,因此ReaderThread将无限循环.

他还声称该程序可以打印042.我知道如何42打印,但不是0.他提到当number变量设置为默认值时会出现这种情况.

我想也许并不能保证在线程之间更新静态变量,但这对我来说非常奇怪.制作readyvolatile会纠正这个问题吗?

他展示了这段代码:

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;  
    }  
}
Run Code Online (Sandbox Code Playgroud)

java concurrency static multithreading memory-visibility

92
推荐指数
5
解决办法
8万
查看次数

在jar中的jar中获取文件

我有这样的设置:

  • outer.jar
    • inner.jar
      • file.txt的

所以,我正在执行outer.jar并在它的主类中:

URL url = Main.class.getClassLoader().getResource("file.txt");
Run Code Online (Sandbox Code Playgroud)

url是:'jar:file:outer.jar!/inner.jar!/file.txt'

但是,如果我尝试阅读它:

url.openStream()
Run Code Online (Sandbox Code Playgroud)

我得到一个例外

Exception in thread "main" java.io.FileNotFoundException: JAR entry inner.jar!/file.txt not found in outer.jar
at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:142)
at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:150)
at java.net.URL.openStream(URL.java:1038)
at Main.main(Main.java:15)
Run Code Online (Sandbox Code Playgroud)

文件肯定在那里.JarURLConnection是不可能的?

java jar

6
推荐指数
1
解决办法
1143
查看次数

内部类&lambda的java.lang.VerifyError

以下代码编译但导致a java.lang.VerifyError.即使未执行run()方法,也会发生错误.

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;


public class TestCase {

    public static void main(String[] args) {
        new TestCase().run();
    }

    public void run() {
        class Inner {

        }
        Map<String, Inner> map = new HashMap<>();
        Function<String, Inner> function = (name) -> {
            Inner i = map.get(name);
            if (i == null) {
                i = new Inner();
                map.put(name, i);
            }
            return i;

        };
        function.apply("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    TestCase.lambda$0(Ljava/util/Map;Ljava/lang/String;)LTestCase$1Inner; …
Run Code Online (Sandbox Code Playgroud)

java lambda jvm-crash

5
推荐指数
1
解决办法
1776
查看次数

如何在XSD中对类型和子类型进行分组

我有这样的XML:

<type>
    <mainType>...</mainType>
    <subtype>...<subtype>
</type>
Run Code Online (Sandbox Code Playgroud)

mainTypes是受限制的xs:strings(它们的列表).每个mainType都有一个可能的子类型列表.IE:
mainTypeA具有可能的亚型:subtype1,subtype2,subtype3
mainTypeB具有可能subtyes:subtype4,subtype5

如何在XSD中表示这一点,以便每个子类型枚举专门与其主要类型链接?有没有更好的方法来表示这两个字段,使XSD更简单?我并不反对更改XML文档结构.

xml xsd

4
推荐指数
1
解决办法
2981
查看次数