Groovy 单例线程安全

Nic*_*nko 3 groovy singleton thread-safety

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

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

cfr*_*ick 5

用作实例的实际类不是线程安全的(除非您创建它)。这里有很多例子(例如,Java 中的 final 静态变量是线程安全的吗?HashMap那里使用了静态 final ,它不是线程安全的)

创建使用groovys单身的@Singleton注释是线程安全的(你应该依靠这一点)。

文档显示两个版本,转换会生成相应的Java代码,:

  1. 这是常规版本@Singleton,它产生一个static final变量,它在java中也是线程安全的:

    public class T {
        public static final T instance = new T();
        private T() {}
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于lazy版本 ( @Singleton(lazy=true))创建双重检查锁定

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

作为参考,这里有一个带有简单类和反汇编代码要点