我的老师在一个关于线程的上层Java课上说了一些我不确定的东西.
他表示以下代码不一定会更新ready变量.根据他的说法,两个线程不一定共享静态变量,特别是在每个线程(主线程对ReaderThread)在其自己的处理器上运行并因此不共享相同的寄存器/缓存/等和一个CPU的情况下不会更新另一个.
从本质上讲,他说有可能ready在主线程中更新,但不在主线程中更新ReaderThread,因此ReaderThread将无限循环.
他还声称该程序可以打印0或42.我知道如何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) 我有这样的设置:
所以,我正在执行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是不可能的?
以下代码编译但导致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) 我有这样的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文档结构.