博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于单例模式
阅读量:5083 次
发布时间:2019-06-13

本文共 1198 字,大约阅读时间需要 3 分钟。

今天去中国银行面试。。。面试官问我对设计模式有什么了解,我就说我最近的项目中自己用单例模式进行了读配置文件。他就让我说说怎么实现,我心中暗喜,这多简单啊。于是就按照饿汉模式说了一遍。。本以为这个问题就这么结束了。可是他突然说,你这种方法不能保证一定是单例的。我楞了。。。于是他说出了双重检测。这个我真是没听说过。面试完了我倍感打击。一个简单的单例模式,没想到让我栽了。不过提醒了我,以后这些东西一定要多看看。不能以为自己做出来了就是OK的。

上网查过以后,发现原来单例实现不只是原来的懒汉式,饿汉式什么的。

1,预先加载

  • class S1 {  
  •     private S1() {  
  •         System.out.println("ok1");  
  •     }  
  •  
  •  
  •     private static S1 instance = new S1();  
  •  
  •     public static S1 getInstance() {  
  •         return instance;  
  •     }  

2,用到时再加载

  • class S2 {  
  •     private S2() {  
  •         System.out.println("ok2");  
  •     }  
  •  
  •     private static S2 instance = null;  
  •  
  •     public static synchronized S2 getInstance() {  
  •         if (instance == null) instance = new S2();  
  •         return instance;  
  •     }  

3,双重检测

  • class S3 {  
  •     private S3() {  
  •         System.out.println("ok3");  
  •     }  
  •  
  •     privatestatic S3 instance = null;  
  •  
  •     publicstatic S3 getInstance() {  
  •         if (instance == null) {  
  •             synchronized (S3.class) {  
  •                 if (instance == null)  
  •                     instance = new S3();  
  •             }  
  •         }  
  •         return instance;  
  •     }  
  • }

4,

  • class S4 {  
  •     private S4() {  
  •         System.out.println("ok4");  
  •     }  
  •  
  •     privatestaticclass S4Holder {  
  •         static S4 instance = new S4();  
  •     }  
  •  
  •  
  •     publicstatic S4 getInstance() {  
  •         return S4Holder.instance;  
  •     }  
  • }

以上内容均引自与博客:,里面还详尽的介绍了单例模式。。不过以我的理解,作者是认为双重检测在java中是不能成立的。。不知道当时面试官为何这么说。。难道他是c语言出身么?

 

转载于:https://www.cnblogs.com/seving/archive/2012/08/23/2652475.html

你可能感兴趣的文章
Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别
查看>>
如果你是程序员,这些细节会害死你(3)
查看>>
xmlhttp的OnReadyStateChange事件
查看>>
python连接oracle数据库
查看>>
C++异常处理
查看>>
捕获键盘和鼠标的消息机制
查看>>
Csharp 简单操作Word模板文件
查看>>
laravel 配置设置
查看>>
常用linux命令
查看>>
git 代码更新
查看>>
eclipse转到idea过程中的基本设置...
查看>>
【Chrome】离线版下载
查看>>
需求分析
查看>>
hadoop-maven项目打包成可执行的jar
查看>>
[欧拉回路][并查集] Bzoj P3706 反色刷
查看>>
Python学习之路:guess_rx_wan
查看>>
字符串转化为可执行的方法
查看>>
select和epoll学习总结
查看>>
pku 3661 Running DP
查看>>
四. Redis事务处理
查看>>