当我阅读Effective Java时,作者告诉我单元素enum类型是实现单例的最佳方式,因为我们不必考虑复杂的序列化或反射攻击.这意味着我们无法创建enum使用反射的实例,对吧?
我做了一些测试,enum这里有一个类:
public enum Weekday {}
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建一个实例Weekday:
Class<Weekday> weekdayClass = Weekday.class;
Constructor<Weekday> cw = weekdayClass.getConstructor(null);
cw.setAccessible(true);
cw.newInstance(null);
Run Code Online (Sandbox Code Playgroud)
如你所知,它不起作用.当我改变关键词enum时class,它有效.我想知道为什么.谢谢.
从"实践中的Java并发"一书第26页:
仅当满足以下所有条件时,才能使用volatile变量:
对变量的写入不依赖于其当前值,或者您可以确保只有一个线程更新该值;
变量不参与其他状态变量的不变量; 和
如何理解" 变量在使用volatile关键字时不参与与其他状态变量的不变量 "?
当我读到" 实践中的java并发 "c03时,我对以下程序感到困惑:
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)
由于重新排序和线程可见性,循环可能永远不会停止,或输出可能为零,但我已尝试多次,输出始终为42.所有原因是我太幸运了?