日常开发中我们经常把一些方法封装到工具类Utils中方便调用。也许你是这样写的
public static class Utils{
public static void A( ){ }
public static void B( ){ }
}
调用的时候直接Utils.A();
但这样也有一定的问题,除非方法被频繁调用而且不用修改,否则不应用太多static方法。
你可以改成这样:
public class Utils{
public void A( ){ }
public void B( ){ }
}
调用的时候new Utils().A();但这样的每次调用都要new一个对象,会占用较多内存,然后你可以用单例模式。
懒汉式:
public class Utils{
public static Utils utils;
private Utils(){}
public Utils getInstance(){
if(utils==null){
utils=new Utils();
}
}
}
饿汉式:
public class Utils{
private static Utils utils=new Utils();
private Utils(){}
public Utils getInstance(){
return utils;
}
}
懒汉式和饿汉式的区别:
1、懒汉式对象只有需要时 才会创建,饿汉式的对象随着类的加载而加载。
2、饿汉式是线程安全的,而懒汉式是线程不安全的。
针对懒汉式线程不安全的特点可以给它加一个锁:
public class Utils{
public static Utils utils;
private Utils(){}
public synchronized Utils getInstance(){
if(utils==null){
utils=new Utils();
}
}
}
加了锁之后又会有新的问题,每次调用getInstance()方法都会带来额外的开销,影响效率,可以使用双重锁定
public class Utils{
public static Utils utils;
private Utils(){}
public Utils getInstance(){
if(utils==null){
synchronized(Utils.class){
if(utils==null)
utils=new Utils();
}
}
}
}