设计模式之单件模式

有人说叫单例模式,可是这有什么关系呢,叫什么都可以。

 

好了进入正题,这个非常简单,就是把构造函数私有化,然后通过一个静态方法获得对象实例

(这年头对象真不好找,都是私有化的)

 

有一个问题就是可能会多线程的时候,导致实例化多次,解决这个问题的方法有三种:

1、同步方法,简单快捷,但是性能较差:

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {}

    public static synchronized Singleton getSingleInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

2、直接实例化,简单粗暴,但是不会延时实例化。

public class Singleton1 {
    public static Singleton1 uniqueInstance = new Singleton1();

    private Singleton1() {}

    public static Singleton1 getInstance() {
        return uniqueInstance;
    }
}

3、通过 同步块 与 volatile 原子操作关键字结合 双重加锁:

public class Singleton2 {
    private volatile static Singleton2 uniqueInstance;

    private Singleton2() {}

    public static Singleton2 getInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton2.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton2();
                }
            }
        }
        return uniqueInstance;
    }
}

注:volatetile应不意味着真正的原子操作,在多线程涉及自身操作时会出现误差,如i++ ,结合同步块可解决此问题。

posted @ 2015-08-18 16:57  ICE_XUE  阅读(158)  评论(0编辑  收藏  举报