标签:java 加载 splay ati lin 判断 静态方法 blocks 比较
单例模式分:(1)饿汉式(2)懒汉式
单例模式要求:(1)私有的构造方法(2)提供获取实例的静态方法
(1)饿汉式
1 public class SingleDemo{ 2 //静态对象,类一旦加载,就实例化; 3 private static SingleDemo singleDemo = new SingleDemo(); 4 //私有化构造方法 5 private SingleDemo(){}; 6 //提供对外访问的方法 7 public static SingleDemo getInstance(){ 8 return singleDemo; 9 } 10 }
(2)懒汉式(注意存在线程安全问题)
1 //方式一:不同步(线程安全问题) 2 public class SingleDemo{ 3 //初始化不创建实例 4 private static SingleDemo singleDemo; 5 //私有化构造方法 6 private SingleDemo(){}; 7 //提供对外访问的方法 8 public static SingleDemo getInstance(){ 9 if(singleDemo==null){ 10 singleDemo = new SingleDemo(); 11 } 12 return singleDemo; 13 } 14 } 15 16 //方式二:同步方法 17 //加同步解决线程安全问题(关键字:synchronized), 18 //这种同步方式,效率欠佳,因为每次获得对象实例,都要先经过synchronized判断锁,之后再判断是否为空 19 20 ; 21 public class SingleDemo{ 22 //初始化不创建实例; 23 private static SingleDemo singleDemo; 24 //私有化构造方法 25 private SingleDemo(){}; 26 //提供对外访问的方法 27 public synchronized static SingleDemo getInstance(){ 28 if(singleDemo == null){ 29 singleDemo = new SingleDemo(); 30 } 31 return singleDemo; 32 } 33 34 } 35 36 //方式三:同步代码块 37 public class SingleDemo{ 38 //初始化不创建实例; 39 private static SingleDemo singleDemo; 40 //私有化构造方法 41 private SingleDemo(){}; 42 //提供对外访问的方法 43 public synchronized static SingleDemo getInstance(){ 44 //第一次创建的时候,首先判断是否为空,然后在判断锁,然后在走一次是否为空,最后创建, 45 //但第二次访问的时候,就只判断是否为空了(这时候不为空,所以不判断锁) 46 if(singleDemo==null){ 47 synchronized(SingleDemo.class){ 48 if(singleDemo == null){ 49 singleDemo = new SingleDemo(); 50 } 51 } 52 } 53 return singleDemo; 54 } 55 }
单例模式,是java中比较常见的设计模式之一,以上有不对之处,望批评指正
标签:java 加载 splay ati lin 判断 静态方法 blocks 比较
原文地址:http://www.cnblogs.com/huaxueyihao/p/6516892.html