目录
1.单例模式
1.1 饿汉模式
1.2 懒汉模式
1.单例模式
单例模式能保证类在程序中只存在唯一一份实例.这一点在很多场景中都需要,比如JDBC中的DataSource实例就只需要一个.
单例模式具体的是实现方法主要有两种:饿汉模式和懒汉模式.
1.1 饿汉模式
饿汉摸模式是指,在类加载的同时,创建实例
这段代码我们很容易理解,在加载类的时候就会创建好实例,通过getInstance 这个静态方法可以获取到这个实例.而该类将其构造方法的属性设为私有,说明在外界不能求创建该实例,确保了该实例只有一份.
因为该线程只涉及到了读操作,所以线程是安全的.
1.2 懒汉模式
类加载的时候不创建实例,第一次使用的时候才创建实例.
懒汉模式单线程版
从以上代码中我们可以发现,只有当第一次调用getInstance()方法时才会创建该类的实例,且只能创建一个实例.
但是这段代码在多线程下,还是安全的吗?很显然,既存在读又存在写,是线程不安全的.但是仔细分析一下,如果实例创建好了,那这段代码在多线程下就是安全的了.
我们加上synchronized可以改善这里的线程安全问题.
理解代码中的双重if判定和volatile:
加锁/解锁是一件开销比较高的事,而该代码只有首次创建实例的时候会出现线程不安全,所以走后续使用的时候就不需要加锁了.故最外层的if就是判断当前实例是否创建好.
volatile就是保证线程安全的可见性.