java – 在现代JVM中双重检查锁定

我有一个类可能会在初始化期间抛出任何运行时异常.我希望这个类是一个单例,因为在内存中保存多个对象的成本很高.我在另一堂课中使用那门课.

我的用例如下:

>我必须使用Controller的单个实例.
> Parent的每个实例都必须使用相同的Controller实例.
>控制器
构造函数可能会抛出异常.
>如果实例化失败,我应该
一段时间后重试实例化.

因此,当我尝试在Controller上执行“get”时,检查我的Controller实例是否为null,如果是,我尝试再次实例化它.

以下是我的代码:

class Parent
{
    private static volatile Controller controller;
    private static final Object lock = new Object();

    static
    {
        try
        {
            controller = new Controller();
        }
        catch(Exception ex)
        {
            controller = null;
        }
    }

    private Controller getController() throws ControllerInstantiationException
    {
        if(controller == null)
        {
            synchronized(lock)
            {
                if(controller == null)
                {
                    try
                    {
                        controller = new Controller();
                    }
                    catch(Exception ex)
                    {
                        controller = null;
                        throw new ControllerInstatntationException(ex);
                    }
                }
            }
        }
        return controller;
    }

    //other methods that uses getController() 
}

我的问题是,这段代码坏了吗?我在某处读到上述代码在JVM 1.4或更早版本中会出现问题.你能提供参考/解决方案吗?请注意,我问这个问题,因为互联网上有很多关于这个主题的混淆.

谢谢.

解决方法:

我相信它没有被打破,导致声明不稳定.但是imho最好避免像这样的代码.无法保证此代码适用于Java 8.还有另一种方法来创建懒惰的单身人士.我总是(差不多)使用这种方法.第一次在Java Concurrency in Practice一书中面对它.

public class Singleton {
        private Singleton() { }

        private static class SingletonHolder { 
                public static final Singleton instance = new Singleton();
        }

        public static Singleton getInstance() {
                return SingletonHolder.instance;
        }
}

我不知道你在代码中做了什么,很难说,如何调整它.最简单的方法,只需使用synchronize方法.您是否真的希望使用双重检查锁定获得一些性能优势?是否有瓶颈同步方法?

上一篇:java – 这应该是同步方法吗?


下一篇:保持JavaScript和CSS同步的实践?