(一)单例模式

一、简单单例模式

所谓单例模式,就是在整个应用中保证只有一个类的实例存在。就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等。

最简单的实现就是,把类的构造方法设为private,从而保证其他类无法直接new出实例。然后在该类中提供一个静态的实例返回给调用者,这样就可以保证只有一个实例。

package 单例模式;

/**
 * Created by shyroke on 2018/4/23.
 */
public class SingleTon {

    private static SingleTon newInstance = null;

    private SingleTon(){}

    public static SingleTon newInstance(){

        if(newInstance ==  null){
            newInstance = new SingleTon();
        }
        return newInstance;
    }


    public static void main(String[] args) {
        SingleTon s1 = SingleTon.newInstance();
        SingleTon s2 = SingleTon.newInstance();
        System.out.println(s1);
        System.out.println(s2);
    }
}

结果如下图,引用地址一样,说明是同一个对象。

二、多线程版的单例

  • 上个例子在并发中是有问题的。
  • 线程A调用newInstance方法,因为是第一次调用,所以newInstance =null.线程A开始创建newInstance 的实例,此时线程B开始执行,这个时候线程A还没实例化newInstance ,此时的newInstance 仍然为null,
  • 所以线程B也开始创建newInstance 的实例,这样一来线程A和线程B都创建了newInstance的实例,单例失败。
原文地址:https://www.cnblogs.com/shyroke/p/8917226.html