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