首页 > 代码库 > 设计模式之单例模式(01)

设计模式之单例模式(01)

单例模式分:(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 }
View Code

(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 }
View Code

单例模式,是java中比较常见的设计模式之一,以上有不对之处,望批评指正

 

设计模式之单例模式(01)