对于程序员来说,好的编码设计模式能大大提高软件的性能,尤其在java语言中,是因为其内存回收机制跟C++完全不一样,它依赖于JVM的“垃圾回收机制”。在java中,一切皆对象,每当我们new一个对象时就在内存空间中分配了一定的内存空间,所以我们要尽可能少new对象,这样才能减少内存空间的浪费。
单例设计模式就是保证类有且仅有一个实例,这种模式很好的用于android应用开发中。单例设计模式分为懒汉式和饿汉式两种,这两种有啥区别呢?
懒汉式是每当要用到的时候才会实例化,而饿汉式是当类加载的时候就已经实例化了,从这方面看,懒汉式更节省空间。
下面我们分别给出懒汉式和饿汉式的两种写法:
1、懒汉式
/**
* 单例设计模式之懒汉式
*/
public class LazySingleton {
private LazySingleton(){}
private LazySingleton instance = null; //先不建立对象
//写法一
// public LazySingleton getInstance(){
// if(instance==null){ //先判断是否这空
// instance = new LazySingleton(); //懒汉式做法
// }
// return instance;
// }
//写法二 同步加锁防止多线程访问时出错
// public synchronized LazySingleton getInstance(){
// if(instance==null){ //先判断是否这空
// instance = new LazySingleton(); //懒汉式做法
// }
// return instance;
// }
//写法三 最安全的方法
public LazySingleton getInstance(){
if(instance==null){ //先判断是否这空
synchronized (LazySingleton.class){
instance = new LazySingleton(); //懒汉式做法
}
}
return instance;
}
}
2、饿汉式
/**
* 单例设计模式之饿汉式
*/
public class HungrySingleton {
private HungrySingleton(){}
private HungrySingleton instance = new HungrySingleton(); //建立对象
public HungrySingleton getInstance(){
return instance; //直接返回单例对象
}
}
总结:
1、所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间不同。
“懒汉式”是在你真正用到的时候才去建这个单例对象
2、在单线程中,两者效果是一样的
3、但是在多线程的环境下,饿汉式没有问题,懒汉式可能会产生初始化多个实例的情况。在多线程的环境下,出错的地方就在if判断这里,没有加线程同步,最高效的保证懒汉式在多线程的环境下,不创建多个对象的代码如下
4、饿汉急要,上来直接先喂饱。
懒汉不急,啥时候用啥时候喂。