标签:style blog http color io 使用 java strong div
转自:http://blog.sina.com.cn/s/blog_75247c770100yxpb.html
面试的时候,常常会被问到这样一个问题:请您写出一个单例模式(Singleton Pattern)吧。好吧,写就写,这还不容易。顺手写一个:
1 //饥饿模式 2 public final class EagerSingleton 3 { 4 private static EagerSingleton singObj = new EagerSingleton(); 5 6 private EagerSingleton(){ 7 } 8 9 public static EagerSingleton getSingleInstance(){ 10 return singObj; 11 } 12 }
这种写法就是所谓的饥饿模式,每个对象在没有使用之前就已经初始化了。这就可能带来潜在的性能问题:如果这个对象很大呢?没有使用这个对象之前,就把它加载到了内存中去是一种巨大的浪费。
1 //懒汉模式 2 public final class LazySingleton 3 { 4 private static LazySingleton singObj = null; 5 6 private LazySingleton(){ 7 } 8 9 public static LazySingleton getSingleInstance(){ 10 if(null == singObj ) singObj = new LazySingleton(); 11 return singObj; 12 } 13 }
这种写法就是所谓的懒汉模式。它使用了延迟加载来保证对象在没有使用之前,是不会进行初始化的。
1 //懒汉模式加Synchronized 2 public final class ThreadSafeSingleton 3 { 4 private static ThreadSafeSingleton singObj = null; 5 6 private ThreadSafeSingleton(){ 7 } 8 9 public static Synchronized ThreadSafeSingleton getSingleInstance(){ 10 if(null == singObj ) singObj = new ThreadSafeSingleton(); 11 return singObj; 12 } 13 }
1 //双重检查锁 2 public final class DoubleCheckedSingleton 3 { 4 private static DoubleCheckedSingletonsingObj = null; 5 6 private DoubleCheckedSingleton(){ 7 } 8 9 public static DoubleCheckedSingleton getSingleInstance(){ 10 if(null == singObj ) { 11 Synchronized(DoubleCheckedSingleton.class){ 12 if(null == singObj) 13 singObj = new DoubleCheckedSingleton(); 14 } 15 } 16 return singObj; 17 } 18 }
这种写法使得只有在加载新的对象进行同步,在加载完了之后,其他线程在第九行就可以判断跳过锁的的代价直接到第15行代码了。做到很好的并发度。
1 //Initialization on Demand Holder 2 public class Singleton 3 { 4 private static class SingletonHolder 5 { 6 public final static Singleton instance = new Singleton(); 7 } 8 9 public static Singleton getInstance() 10 { 11 return SingletonHolder.instance; 12 } 13 }
标签:style blog http color io 使用 java strong div
原文地址:http://www.cnblogs.com/x_wukong/p/3962315.html