单例模式(Singleton)

<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;
        }
    }

    这种模式是利用对象实例化线程安全的方式  获取对象的时候才在内部类实例化。强烈推荐这种用法!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值