单例模式
2016-04-18 10:22
211 查看
public class Singleton {
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
高人写的
如果用第三种,建议声明为final的,因为我们没有理由不将其声明为final的。另外,关于双重锁定,建议你看看EhCache的源代码里的CacheManager类,new了新的实力后,应该在synchronized块内return,其余一致,包括将实例声明为原子的。
附EhCache项目CacheManager部分源代码:
Java代码
public static CacheManager create() throws CacheException {
if (singleton != null) {
return singleton;
}
synchronized (CacheManager.class) {
if (singleton == null) {
LOG.debug("Creating new CacheManager with default config");
singleton = new CacheManager();
} else {
LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
}
return singleton; // 这里是在synchronized块内返回的,而你的例子不是
}
}
原文:http://cantellow.iteye.com/blog/838473#comments
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
高人写的
如果用第三种,建议声明为final的,因为我们没有理由不将其声明为final的。另外,关于双重锁定,建议你看看EhCache的源代码里的CacheManager类,new了新的实力后,应该在synchronized块内return,其余一致,包括将实例声明为原子的。
附EhCache项目CacheManager部分源代码:
Java代码
public static CacheManager create() throws CacheException {
if (singleton != null) {
return singleton;
}
synchronized (CacheManager.class) {
if (singleton == null) {
LOG.debug("Creating new CacheManager with default config");
singleton = new CacheManager();
} else {
LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
}
return singleton; // 这里是在synchronized块内返回的,而你的例子不是
}
}
原文:http://cantellow.iteye.com/blog/838473#comments
相关文章推荐
- C++_友元函数
- SCOJ 4493: DNA 最长公共子串 后缀自动机
- mysql中怎么实现oracle中的to_char和to_date
- mule学习2
- source insight 中文乱码的解决方案
- 模式识别的评价方法:ROC曲线, DET曲线, FPPW, FPPI
- js 格式化日期
- allegro reuse功能
- 存储过程简介
- (六)6.15 Neurons Networks Deep Belief Networks
- jQuery实现AJAX定时刷新局部页面实例
- linux添加用户
- J2SE(五)Java之类的加载机制
- Hibernate常用函数API
- 通过system调用Am命令执行动作
- 在Linux中查看所有正在运行的进程和top命令详解
- LFCS 系列第六讲:组装分区为RAID设备——创建和管理系统备份
- LFCS 系列第六讲:组装分区为RAID设备——创建和管理系统备份
- 为什么我要垂直对齐代码(你也要如此!)
- Selenium RC(Selenium 1.0)的工作原理