单例模式

来源:互联网 发布:手机网络加速器官 编辑:程序博客网 时间:2024/06/06 11:39

在这里,构造函数要设置为private ,否则我们没有限制它new的理由。

GetInstance是static的,因为我们从来不通过对象来调用这个方法。进而导致了instance域也变成了static,因为是在static方法中使用。

 

多线程时的单例

在多线程中,多个线程访问GetInstance方法,可能是能造成多个实例被产生的。因为两个线程可能都同时通过了instance==null的判断

但是这样会造成性能问题。这样使得每个调用GetInstance的情况都进行了排队。

下面我们进行改良。

在这里,如果已经产生了实例,我们让它返回,对于instance为null的情况,我们进行加锁,但是在里面为什么还要再进行一次判断呢。

因为两个线程可能同时经过了instance==null的判断,到了lock那里,开始排队,当一个线程实例化之后,如果没有第二次判断,那么第二个线程还是可以在进入临界区后再创建一个实例,所以我们要再判断一次,这叫Double-Check Locking.

 

还有一种方法,可以不写线程安全的代码,也可以解决多线程环境下的安全问题。

这种方式生成单例的时间比较早,是在类加载的时候就会生成,而前面叙述的是在调用GetInstance方法的时候才会被调用。所以我们称前面叙述的那一种为懒汉式单例类,而后面的那一种为饿汉式单例类。