单例模式(Singleton)

来源:互联网 发布:海康威视网络设置方法 编辑:程序博客网 时间:2024/06/04 18:14
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">单例模式保证在应用程序中只有一个实例,避免频繁实例化对象。</span>
  1. public class Region {    private Region(){    }    private static Region region = null;    private static Region getInstance(){        if(region==null){            region = new Region();        }        return region;    }}

    首先构造函数要是私有的,避免被实例化(反射方式除外)。上例中,是一个简单的单例类,使用时直接调用Region.getInstance()即可。但是在多线程环境下不安全,会导致多次实例化。
  2. public class Region {    private Region(){    }    private static Region region = new Region();    private static Region getInstance(){        return region;    }}

    该方式是在系统启动的时候就初始化一个对象,虽然是线程安全的,但是并不推荐。我们最后做到在系统需要的时候再初始化,这样可以提高系统加载速度。
  3. public class Region {    private Region(){    }    private static Region region = null;    private static Region getInstance(){       synchronized (Region.class){            if(region==null){                region = new Region();            }           return region;       }    }}
    该例子是线程安全的,我们使用了synchronized关键字,也是在需要的时候初始化对象,但是每次获取对象的时候都要排队获取对象,效率肯定会低很多,我们需要的时候只有第一次加锁

  4. public class Region {    private Region() {    }    private static Region region = null;    private static Region getInstance() {        if (region == null) {            synchronized (Region.class) {                if (region == null) {                    region = new Region();                }            }        }        return region;    }}

    在该方法中,我们首先判断是否为空,如果为空再加锁进入,进入之后再判断是否为空,如果为空则实例化。实例化之后,再有线程获取对象就会直接获取实例化的对象,不需要经过锁了,效率提高很多,推荐这样写法。
  5. public class Region {    private Region() {    }    private static Region region = null;    private static class SinletonClass{        private static Region instance = new Region();    }    private static Region getInstance() {       return SinletonClass.instance;    }}

    这种模式是利用对象实例化线程安全的方式  获取对象的时候才在内部类实例化。强烈推荐这种用法!!!
0 0
原创粉丝点击