为什么有单例模式
有个很经典的例子,就是一山不容二虎,就像中国古代只能允许一个中央集权的皇帝来发号施令。
java定义
一个类有且仅有一个实例,并且一旦创建了该实例就要保证能被整个系统使用。
常用单例
下面介绍下面试常问的懒汉式、饿汉式以及双重检查加锁的写法。
懒汉式
/**
* @author 沉鱼
* @date 2017/12/20 21:07
*/
public class LazySingleton {
//太懒,实例都懒得创建,等外界要用的时候再创建
private static LazySingleton singleton = null;
//私有构造器,不允许外界创建实例
private LazySingleton() {
}
//线程不安全,这也是面试的一个问点
/*public static LazySingleton GetInstance() {
if (singleton == null) {
singleton = new LazySingleton();
}
return singleton;
}*/
//线程安全的一个写法
public static synchronized LazySingleton getSingleton() {
if (singleton == null) {
singleton = new LazySingleton();
}
return singleton;
}
}
特点
1、教你们一个记忆方式,因为太懒唯一的实例都要外界要用时才创建,所以叫懒汉式。
2、因为线程不安全加了synchronized 同步锁,从而降低实例访问速度,降低性能
饿汉式
/**
* @author 沉鱼
* @date 2017/12/20 21:28
*/
public class HungrySingleton {
private static HungrySingleton singleton = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getSingleton() {
return singleton;
}
}
特点
1、因为太饿,在类的加载中就已经创建了实例
2、线程安全,消耗内存
双重检查加锁
/**
* @author 沉鱼
* @date 2017/12/20 21:35
*/
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
特点
1、双重判空,如果面试官在没有指定你要用懒汉或者饿汉的写法,单纯让你写单例的话,建议这样写
总结
单例的特点要保证
1、私有化构造器
2、静态对外提供获取实例的方法,保证整个系统都能访问到该实例
写博客虽然很浪费时间,但是有句话叫做好记性不如烂笔头,一方面加深自己映像,一方面若干年后翻看自己博客可以忆往昔感概多个夜晚在电脑前的噼里啪啦;当然如果有幸帮助到别人,那就非常有意义了。