Groovy中的@Singleton注释是否使单例线程安全?
如果不是,那么使用Groovy创建线程安全单例的最简单方法是什么?
答案 0 :(得分:3)
用作实例的实际类是不线程安全(除非您创建它)。这里有很多例子(例如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 () } } } } }