使用静态内部类实现单例设计模式
2017-08-19 19:08
302 查看
前几天看了下公司代码中的一个单例类,发现居然是用静态内部类实现的。后面在网上找了下资料,发现使用静态内部实现的单例是懒加载的且线程安全。
从网上资料得出如下结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
(2)这样实现有什么好处?
我记得以前接触的懒汉式的代码好像有线程安全问题,需要加同步锁才能解决。
采用静态内部类实现的代码也是懒加载的,只有第一次使用这个单例的实例的时候才加载;
同时不会有线程安全问题
(3)参考文档
http://yongliang567.iteye.com/blog/904467
从网上资料得出如下结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
一、代码
package com.zxy.test; /** * 使用静态内部类实现的单例类 * @author ZENG.XIAO.YAN * @date2017-08-08 10:29:20 * @version V1.0 */ public class UserSingleton { /** 私有化构造器*/ private UserSingleton() { } /** 对外提供公共的访问方法*/ public static UserSingleton getInstance() { return UserSingletonHolder.INSTANCE; } /** 写一个静态内部类,里面实例化外部类*/ private static class UserSingletonHolder { private static final UserSingleton INSTANCE = new UserSingleton(); } }26 1
package com.zxy.test;2
/**3
* 使用静态内部类实现的单例类4
* @author ZENG.XIAO.YAN5
* @date 2017-08-08 10:29:206
* @version V1.07
*/89
public class UserSingleton {10
11
/** 私有化构造器*/12
private UserSingleton() {13
}1415
/** 对外提供公共的访问方法*/16
public static UserSingleton getInstance() {17
return UserSingletonHolder.INSTANCE;18
}1920
21
/** 写一个静态内部类,里面实例化外部类*/22
private static class UserSingletonHolder {23
private static final UserSingleton INSTANCE = new UserSingleton();24
}2526
}
package com.zxy.test; /** * 使用静态内部类实现的单例类 * @author ZENG.XIAO.YAN * @date2017-08-08 10:29:20 * @version V1.0 */ public class UserSingleton { /** 私有化构造器*/ private UserSingleton() { } /** 对外提供公共的访问方法*/ public static UserSingleton getInstance() { return UserSingletonHolder.INSTANCE; } /** 写一个静态内部类,里面实例化外部类*/ private static class UserSingletonHolder { private static final UserSingleton INSTANCE = new UserSingleton(); } }x 1
package com.zxy.test;2
/**3
* 使用静态内部类实现的单例类4
* @author ZENG.XIAO.YAN5
* @date 2017-08-08 10:29:206
* @version V1.07
*/8
public class UserSingleton {910
/** 私有化构造器*/11
private UserSingleton() {12
}1314
/** 对外提供公共的访问方法*/15
public static UserSingleton getInstance() {16
return UserSingletonHolder.INSTANCE;17
}18
19
/** 写一个静态内部类,里面实例化外部类*/20
private static class UserSingletonHolder {21
private static final UserSingleton INSTANCE = new UserSingleton();22
}2324
}
二、小结
(1)为什么这样实现就是单例的? 因为这个类的实例化是靠静态内部类的静态常量实例化的。 INSTANCE 是常量,因此只能赋值一次;它还是静态的,因此随着内部类一起加载。(2)这样实现有什么好处?
我记得以前接触的懒汉式的代码好像有线程安全问题,需要加同步锁才能解决。
采用静态内部类实现的代码也是懒加载的,只有第一次使用这个单例的实例的时候才加载;
同时不会有线程安全问题
(3)参考文档
http://yongliang567.iteye.com/blog/904467
相关文章推荐
- 设计模式之使用静态块,静态内部类,枚举类实现单例模式
- 设计模式之使用Enum来实现strategy(策略模式系列2)
- 设计模式应用之使用COMPOSITE模式实现流程(二)
- PHP设计模式笔记:使用PHP实现单例模式
- 设计模式应用之使用COMPOSITE模式实现流程(四)
- 设计模式- 使用抽象工厂实现多数据库切换实现过程
- 使用设计模式实现Undo,Redo框架
- 使用C++实现设计模式(连载): 第一回 Singleton 单例模式
- JTABLE 一个小格子添加2个按钮实现国际化 使用观察者设计模式
- PHP设计模式笔记:使用PHP实现门面模式
- 设计模式-使用php实现工厂方法模式
- 使用观察者模式实现Java应用程序设计MVC模式
- PHP设计模式笔记:使用PHP实现工厂模式
- 《Effective C#》读书笔记——条目25:用事件模式实现通知<使用C#表达设计>
- php使用接口实现工厂设计模式
- PHP设计模式笔记:使用PHP实现适配器模式
- 怎样使用Java实现Factory设计模式
- 使用C++实现设计模式(连载): 第二回 Factory 工厂模式
- C#设计模式之 :Abstract_Factory模式(使用接口实现)
- PHP设计模式笔记:使用PHP实现单例模式