首页 > 代码库 > 2016/11/17
2016/11/17
1.单例设计模式
(1)懒汉模式
1 public class Singleton { 2 3 private Singleton() {} 4 private static Singleton singleton = null; 5 // 这里可以加同步锁解决线程安全问题 6 public static Singleton getInstance() { 7 if(singleton == null) { 8 singleton = new Singleton(); 9 } 10 return singleton; 11 } 12 }
(2)饿汉模式
1 public class Singleton2 { 2 3 public Singleton2() { 4 } 5 private static final Singleton2 singleton2 = new Singleton2; 6 7 public static Singleton2 getInstance(){ 8 return singleton2; 9 } 10 }
懒、饿汉之间的比较
(1)加载时机
懒汉:懒汉很懒,只有当调用getInstance()方法时,才会初始化这个实例类
饿汉:饿汉很饥饿,类一旦加载,实例就初始化完成,保证在调用getInstance()方法时,单利是已经存在的
(2)线程安全性
懒汉:线程不安全.并发环境下很可能出现多个Singleton实例.解决办法是可以添加同步锁
饿汉:饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题
(3) 资源加载和性能:
懒汉:延迟加载,第一次调用时才会初始化,性能上会有所延迟.
饿汉:类创建的同时就实例化一个静态对象,不论之后是否用到这个对象,都已初始化并占用一定的内存.第一次调用个时候相对较快.
(4) 懒汉设计模式线程安全问题的解决方案
利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗
1 public class SafeSingleton { 2 3 public SafeSingleton() { 4 } 5 private static class LasyHolder{ 6 private static final SafeSingleton INSTANCE = new SafeSingleton(); 7 } 8 9 public static final SafeSingleton getInstance(){ 10 return LasyHolder.INSTANCE; 11 } 12 }
2016/11/17
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。