设计模式之 Java 中的单例模式(Singleton)(2)

在时刻 1和 2,由于还没有创建单例对象,Thread 1 和 Thread 2都会进入创建单例实例的代码块分别创建实例。在时刻 3 ,Thread 1创建了一个实例对象,但是 Thread 2此时已无法知道,于是继续创建一个新的实例对象,导致这两个线程持有的实例并非为同一个。

更为糟糕的是,在没有自动内存回收机制的语言平台上运行这样的单例模式,如:C++,以为我们认为创建了一个单例实例,忽略了其他线程所产生的对象,不会手动去回收它们,从而引起内存泄漏。

为了解决这个问题,我们给次方法添加 关键字,代码如下:

public  static  synchronized  Singleton getInstance() {
    if  ( instance  ==  null ) {
        instance  =  new  Singleton();
    }
    return  instance ;
}

这样,再多的线程访问都只会实例化一个单例对象,实现了多线程的安全访问,但是在多线程高并发访问的情况下,给此方法加上 synchronized 关键字会是得性能大不如前。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/e359be4ee4a6ead3de422f3262d72a58.html