http://blog.csdn.net/it_man/article/details/5787567
以下是我再次研究单例(java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了
Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦。
总结一下我所知道的单例模式实现方式:
1.预先加载法
-
class S1 {
-
private S1() {
-
System.out.println("ok1");
- }
-
private static S1 instance = new S1();
-
public static S1 getInstance() {
-
return instance;
- }
- }
- class S1 {
- private S1() {
- System.out.println("ok1");
- }
- private static S1 instance = new S1();
- public static S1 getInstance() {
- return instance;
- }
- }
优点:
1.线程安全的
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
缺点: 资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化了
2.initialization on demand,延迟加载法 (考虑多线程)
-
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;
- }
- }
- 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;
- }
- }
优点: 资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点: 第一次加载时发应不快 ,多线程使用不必要的同步开销大
3.initialization on demand double check 双重检测( 考虑多线程 )
-
class S3 {
-
private S3() {
-
System.out.println("ok3");
- }
-
private static S3 instance = null;
-
public static S3 getInstance() {
-
if (instance == null) {
-
synchronized (S3.class) {
-
if (instance == null)
-
instance = new S3();
- }
- }
-
return instance;
- }
- }
- class S3 {
- private S3() {
- System.out.println("ok3");
- }
- private static S3 instance = null;
- public static S3 getInstance() {
- if (instance == null) {
- synchronized (S3.class) {
- if (instance == null)
- instance =