Nic*_*nko 3 groovy singleton thread-safety
Groovy 中的 @Singleton 注释是否使单例线程安全?
如果不是,使用 Groovy 创建线程安全单例的最简单方法是什么?
用作实例的实际类不是线程安全的(除非您创建它)。这里有很多例子(例如,Java 中的 final 静态变量是线程安全的吗?:HashMap那里使用了静态 final ,它不是线程安全的)
在创建使用groovys单身的@Singleton注释是线程安全的(你应该依靠这一点)。
该文档显示两个版本,转换会生成相应的Java代码,:
这是常规版本@Singleton,它产生一个static final变量,它在java中也是线程安全的:
Run Code Online (Sandbox Code Playgroud)public class T { public static final T instance = new T(); private T() {} }
对于lazy版本 ( @Singleton(lazy=true))创建双重检查锁定:
Run Code Online (Sandbox Code Playgroud)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 () } } } } }
作为参考,这里有一个带有简单类和反汇编代码的要点