欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例模式的学习

程序员文章站 2022-05-22 19:54:16
...

通常会使用的这样的写法来实现单例:

 

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

 

单例的目的是为了保证运行时Singleton类只有唯一的一个实例,最常用的地方比如拿到数据库的连接,Spring的中创建BeanFactory这些开销比较大的操作,而这些操作都是调用他们的方法来执行某个特定的动作。


面试官的问题是:单例会带来什么问题?


我第一反映就是如果多个线程同时调用这个实例,会有线程安全的问题,当时就这么说了,然后他问:“怎么实现一个线程安全的单例模式呢?”


这个问题我没有回答上来,当时脑子里闪了一下如果用synchronized来锁定可能会有一些问题,至于是什么问题没有想明白,就选择没有回答。


这里请问各位高手,

1、如果不执行修改对象的操作的情况下,单单执行一个读取操作,还有没有进行同步的必要?

2、保证单例的线程安全使用synchronized会产生什么样的问题?

3、不使用synchronized,有什么方式来保证线程安全?

4、假如下次再面试遇到这种情形,用什么方式回答会使面试官感到比较满意?

 

回答:

 

public class Singleton {  
      
    private Singleton() {}  
    // 载入class时立即初始化
    private static Singleton instance = new Singleton();  
  
    public static Singleton getInstance() {  
        
        return instance;  
    }  
}  

 

 当然这种也有缺点,instance会立即初始化,而不管是否实际用到。

 

相关标签: 面试 Spring