单例模式

单例模式

单例模式

多个线程操作同一对象,要保证对象的唯一性

解决方案

实例化过程只实例化一次

提供返回实例的方法

分类

  1. 饿汉式
public class HungrySingleton {
    //加载的时候就产生了实例对象
    private static HungrySingleton Instanse = new HungrySingleton();

    private HungrySingleton() {
    }
    // 返回实例对象
    public static HungrySingleton getInstanse() {
        return Instanse;
    }
}
  • 线程安全性 : 再加载的时候已经被实例化,只有这一次,线程安全的
  • 懒加载 : 没有延迟加载[占用内存空间],影响部分性能
  • 性能比较好
  1. 懒汉式
public class HoonSingleton {
    private static HoonSingleton Instance = null;

    private HoonSingleton() {
    }

    public static HoonSingleton getInstance() {
        if(null == Instance){   // 两个线程同时执行到这块,可能同时生成两个新对象
            Instance= new HoonSingleton();
        }
        return  Instance;
    }
}
  • 线程安全性 : 非线程安全的(不能保证对象的唯一性)
  • 懒加载
  1. 懒汉式+同步方法
public class HoonSingleton {
    private static HoonSingleton Instance = null;

    private HoonSingleton() {
    }

    public synchronized static HoonSingleton getInstance() {
        if(null == Instance){   // 两个线程同时执行到这块,可能同时生成两个新对象
            Instance= new HoonSingleton();
        }
        return  Instance;
    }
}
  • 线程安全性: 线程安全[锁的粒度很大]
  • 性能 : 并发线程可能变为串行
  1. Double check Locking
public class DCL {
    private static DCL Instance = null;
    private connection conn = null ;
    private Socket socket = null ; 
    private DCL() {
    }
    public static DCL getInstance() {
        if (null == Instance) {  //这里可能有线程同时进入
            synchronized (DCL.class) {
                if (null == Instance) {//这里肯定只能有一个线程进入,在这里再进行一次判空操作
                    Instance = new DCL();
                }
            }
        }
        return Instance;
    }

  • 线程安全性 :线程安全
  • 懒加载
  • 性能比较好
  • 问题 : 会因为指令重排,出现指令重排

在这里插入图片描述

解决方案 :

Volatile + Double check Locking

private static volatile DCL Instance = null;

volatile 之前之后的代码不发生指令重排

  1. Holder
public class HolderDemo {
        private static class Holder {
            private static HolderDemo Instance = new HolderDemo();
        }// 实现了懒加载
        //没有使用synchronized
        //< init>
        public static HolderDemo getInstance() {
            return Holder.Instance;
        }
    
    
    }
  • 懒加载 : 静态内部类中的 HolderDemo 的实例只有在调用的时候进行实例化
  • 没有使用synchronized,效率高
  1. 枚举

Effective Java

public enum EnumSingleTon {
    INSTANCE ; // 常量 ,在加载实例化一次,
    public  static  EnumSingleTon getInstance(){
        return  INSTANCE;
    }
}




public class EnumSingletonDemo {
    private EnumSingletonDemo() {
    }
    private enum EnumHolder {
        INSTANCE;
        private EnumSingletonDemo instance;

        EnumHolder() {
            this.instance = new EnumSingletonDemo();
        }
        private EnumSingletonDemo getInstance() {
            return instance;
        }
    }
    public static EnumSingletonDemo getInstance() {
        return EnumHolder.INSTANCE.instance;
    }
}

  • 实现了懒加载
  • 充分利用了enum 中的对象为常量,只实例化一次
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值