小编xin*_*ang的帖子

如何在Java中使用反射创建枚举实例?

当我阅读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)

如你所知,它不起作用.当我改变关键词enumclass,它有效.我想知道为什么.谢谢.

java reflection enums

13
推荐指数
4
解决办法
2万
查看次数

如何理解"变量在使用volatile关键字时不参与与其他状态变量的不变量"?

从"实践中的Java并发"一书第26页:

仅当满足以下所有条件时,才能使用volatile变量:

  • 对变量的写入不依赖于其当前值,或者您可以确保只有一个线程更新该值;

  • 变量不参与其他状态变量的不变量; 和 

  • 在访问变量时,出于任何其他原因,不需要锁定.

如何理解" 变量在使用volatile关键字时不参与与其他状态变量的不变量 "?

java concurrency volatile

11
推荐指数
1
解决办法
886
查看次数

java线程可见性

当我读到" 实践中的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.所有原因是我太幸运了?

java concurrency

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

标签 统计

java ×3

concurrency ×2

enums ×1

reflection ×1

volatile ×1