Groovy中的@Singleton注释是否使单例线程安全?

如果不是,那是使用Groovy创建线程安全的单例的最简单方法?

最佳答案

用作实例的实际类不是线程安全的(除非您创建了它)。此处有很多示例(例如Are final static variables thread safe in Java?:在那里使用静态最终HashMap,这不是线程安全的)

使用groovys @Singleton批注创建单例是线程安全的(您应该依靠它)。

docs显示转换生成的相应Java代码的两个版本:


这是常规版本@Singleton,它生成一个static final变量,该变量在Java中也是线程安全的:


public class T {
    public static final T instance = new T();
    private T() {}
}


对于lazy版本(@Singleton(lazy=true)),创建了Double-checked locking


class T {
    private static volatile T instance
    private T() {}
    static T getInstance () {
        if (instance) {
            instance
        } else {
            synchronized(T) {
                if (instance) {
                    instance
                } else {
                    instance = new T ()
                }
            }
        }
    }
}




供参考,这里是gist with a simple class and the disassembled code

09-17 18:16
查看更多