Groovy单例线程安全

时间:2014-09-24 18:04:21

标签: groovy thread-safety singleton

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

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

1 个答案:

答案 0 :(得分:3)

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

使用groovys @Singleton注释的单例的创建是线程安全的(你应该依赖它)。

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

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

    public class T {
        public static final T instance = new T();
        private T() {}
    }
    
  2. 对于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 ()
                    }
                }
            }
        }
    }
    
  3. 供参考,这是gist with a simple class and the disassembled code