一、简单单例模式
所谓单例模式,就是在整个应用中保证只有一个类的实例存在。就像是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的实例,单例失败。