单例模式和有上限的多例模式
单例模式用一句话解释就是一个类只能产生一个对象
我们都知道可以用一个new 关键字来产生一个对象,然后new的时候就会调用相应的构造函数
到这里我想如何控制类实例个数为1应该有了一点思路了
就是把构造函数设置为private,就可以阻止外部类创建对象了(这里不考虑利用反射机制去创建)
我们举个例子顺便给出代码:
一个国家只有一个领导人,然后有许多的公民。我们任何时候见到的领导都是一个。相对应的类图如下:
对应的代码实现:
运行结果:
我是唯一的领导人
我是唯一的领导人
在给一个单例模式的通用类图
代码为:
这种形式的单例模式是线程安全的,这种模式也被称为饿汉模式。
下面的是一种线程不安全的单例模式,也被称为是懒汉模式:
现在就分析一下为什么这样的写法是线程不安全的
该单例模式在低并发条件下不会出现问题。但是一旦系统压力过大,并发量增加就会出现一个内存中出现多个实例的情况
比如一个线程执行到 singleton = new Singleton(),但是因为对象的初始化需要时间,所以暂时singleton还是为空
刚好在这个时候另外一个线程执行了 singleton == null 的判断,此刻是满足条件的。所以就导致两个线程都获得了singleton对象,即在内存中出现了两个对象
解决线程安全的方法第一种方法就是使用上面的饿汉模式去实现
第二种解决方法就是在getInstance方法前面加上synchronized关键字。这种模式也叫线程安全的懒汉模式。
具体实现如下:
第三种解决方法为:在getInstance方法内部加上synchronized关键字
具体实现如下:
最后一个要说的就是单例模式的一个扩展:有上限的多例模式
这样的好处是我们可以决定内存中有多少个实例,可以修正单例模式带来的性能问题。
UML图如下:
具体代码实现如下:
测试代码:
运行结果:
到此单例模式以及扩展的有上限的多例模式讲解结束。