标签:饿汉 创建 nal 线程安全 利用 stat 调用 解决办法 存在
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 }
标签:饿汉 创建 nal 线程安全 利用 stat 调用 解决办法 存在
原文地址:http://www.cnblogs.com/ceder/p/6072822.html