[关闭]
@HUST-SuWB 2015-02-10T15:21:05.000000Z 字数 1029 阅读 385

实现单例模式

读书笔记


出自《剑指Offer》的面试题2,原题题目为:设计一个类,我们只能生成该类的一个实例。
一看到这道题,第一反应是完全没有思路。本来就对设计模式不够熟悉,再加上平常的业务处理中根本不会有涉及到这类需求的问题,因此,从来没有考虑过该如何去实现单例模式。但是,如果静下心来思考的话,生成类的实例必须调用构造方法,那么似乎可以通过私有化构造方法的方式让构造方法对外隔离,剩下的方式就是这唯一的一个实例怎么生成了。如果在类里定义静态的实例,就可以在需要的时候创建该实例。

  1. /**
  2. * 《剑指Offer》面试题2
  3. * @author SuWB
  4. *
  5. */
  6. public class Singleton {
  7. private Singleton(){}
  8. private static Singleton singleton = null;
  9. public static Singleton getSingleton(){
  10. if(singleton == null){
  11. singleton = new Singleton();
  12. }
  13. return singleton;
  14. }
  15. }

上面的代码是第一反应,但是仔细思考的话,会发现这里面还是有很多问题,其中最显著的问题在于,这段代码只能在单线程的情况下运行,那么,如果考虑多线程的话,要怎么办呢。这时候同步锁就派上用场了。

  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. /**
  4. * 《剑指Offer》面试题2
  5. * @author SuWB
  6. * 适用多线程
  7. */
  8. public class Singleton_Mutiple{
  9. private Singleton_Mutiple(){}
  10. private static Singleton_Mutiple singleton = null;
  11. public static Singleton_Mutiple getSingleton(){
  12. if(singleton == null){
  13. Lock lock = new ReentrantLock();
  14. lock.lock();
  15. try{
  16. if(singleton == null){
  17. singleton = new Singleton_Mutiple();
  18. }
  19. }catch(Exception e){
  20. e.printStackTrace();
  21. }finally{
  22. lock.unlock();
  23. }
  24. }
  25. return singleton;
  26. }
  27. }

个人觉得能考虑到这个地步已经足够了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注