`

单例模式的学习

阅读更多

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

 

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会立即初始化,而不管是否实际用到。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics