1,什么是单例模式
有时候我们只需要一个类的唯一对象,而不会创建更多的对象时候,就需要单例模式了。
2,单例模式的好处
单例模式有很多好处,首先可以避免对象反复的创建,从而减少了内存空间的消耗,更重要的是如果在整个程序中
需要一个全局管理的对象,而且这个对象只有一个那么单例模式就是一个很好的选择了
3,单例模式如何写
单例模式有很多种写法,我们来了解一下各自的区别
//饿汉式
/*
从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返
回给调用者。饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都
存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问
题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。
*/
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton newInstance(){
return instance;
}
}
//懒汉式
/*
懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是
直接返回之前创建的对象。如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创
建,这个时候使用懒汉模式就是一个不错的选择。
*/
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
/*
但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实
例,因此需要加锁解决线程同步问题,实现如下。
*/
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
//双重校验锁
/*
加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。
synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。因此
就有了双重校验锁,先看下它的实现代码。
*/
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
4,总结
实际上单例的写法还有静态内部类,和枚举的写法,但是实际开发中很少有人这么去写
单例模式有多种方式,选择最合适的方式即可
在开发中常用的写法是双重校验锁的方式
单例模式适合全局只需要一个对象的场景
|
|