定义:确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。
饿汉式单例
1 public class A{ 2 3 private static final A a= new A(); 4 5 private A(){}; 6 7 public static A getInstance(){ 8 return a; 9 } 10 11 }
我们通常会用下面的格式定义一个单例:线程不安全单例
1 public class B { 2 3 private static B b = null; 4 5 private B(){}; 6 7 public static B getInstance(){ 8 if (b == null) { 9 b = new B(); // 如果线程A执行到次行,但还没有获取到对象,这时第二个线程B也在执行,执行到(b == null)判断,那么线程B获得的条件为真,于是继续运行下去,这样线程A和B各自获得了一个对象,在内存中就会出现两个对象! 10 } 11 return b; 12 } 13 14 }
解决线程安全的方法很多,可以在getInstance方法前加synchronized关键字,也可以在getInstance方法内增加synchronized来实现,但都不是最优秀的单例模式,建议使用“饿汉式单例”!
懒汉式单例(加入了synchronized)
1 public class B { 2 3 private static B b = null; 4 5 private B(){}; 6 7 public static synchronized B getInstance(){ 8 if (b == null) { 9 } b = new B(); 10 11 return b; 12 } 13 14 }
有上限多例:方便系统扩展,修正单例可能存在的性能问题,提供系统响应速度
1 public class C { 2 3 /** 4 * 上限数量 5 */ 6 private static final int MAX = 2; 7 8 /** 9 * C对象的“名字”list 10 */ 11 private static List<String> names = new ArrayList<String>(); 12 13 /** 14 * C对象list 15 */ 16 private static List<C> models = new ArrayList<C>(); 17 18 /** 19 * 当前序列号 20 */ 21 private static int curNum = 0; 22 23 24 static { 25 for (int i = 0; i < MAX; i++) { 26 models.add(new C("C对象" + i)); 27 } 28 } 29 30 private C() { 31 } 32 33 /** 34 * 建立一个带"名字"的C对象 35 * @param name 36 */ 37 private C(String name){ 38 names.add(name); 39 } 40 41 public static C getInstance(){ 42 Random random = new Random(); 43 44 curNum = random.nextInt(MAX); 45 46 return models.get(curNum); 47 } 48 49 public void say(){ 50 System.out.println(names.get(curNum)); 51 } 52 53 }
1 public class Main { 2 3 public static void main(String[] args) { 4 int max = 5; 5 for (int i = 0; i < max; i++) { 6 System.out.print("第" + i + "个C对象:"); 7 C.getInstance().say(); 8 } 9 } 10 11 }
原文地址:http://www.cnblogs.com/maxinliang/p/3817521.html