单例模式在实际开发中比较常用,之前接触中只了解懒汉式和饿汉式,而单例的实现一共包含饿汉和懒汉在内一共是5中实现方式,为了一目了然部分实现直接上图片。
1、饿汉式(左侧)
2、懒汉式(右侧)
两者实现的不同,直接反应到使用上:
①饿汉式的实例,在类初始化时直接完成实例化,不支持延时加载,懒汉式相反。
②饿汉式的访问接口没有进行同步控制,所以调用效率高,懒汉式相反。
3、静态内部类
静态内部类结合了饿汉和懒汉的优点:可延时、线程安全、调用效率高。
①可延时:对象的实例化放在了静态内部类中,类在进行初始化时不会执行到静态内部类,只有在调用getInstance()方法时才会执行静态内部类的方法,实现对象的实例化
②内部类的加载过程是天然线程安全的
4、枚举类实现单例
优点:简单、线程安全、调用效率高。
缺点:不能实现延时
5、Double Check
缺点:JVM底层内部模型原因,偶尔会出问题,不建议使用(具体原因不详)。
总结
频繁调用的建议使用调用效率高的,如果创建代价大建议使用可延时的。
不需要延时的:枚举 好于 饿汉
需要延时的:静态内部类 好于 懒汉式
可下载测试代码。(http://download.youkuaiyun.com/detail/u013030682/9884459)