Android(java)学习笔记18:单例模式

单例模式代码示例:

1. 单例模式之饿汉式

 1 package cn.itcast_03;
 2 
 3 public class Student {
 4     // 构造私有
 5     private Student() {
 6     }
 7 
 8     // 自己造一个
 9     // 静态方法只能访问静态成员变量,加静态
10     // 为了不让外界直接访问修改这个值,加private
11     private static Student s = new Student();
12 
13     // 提供公共的访问方式
14     // 为了保证外界能够直接使用该方法,加静态,不加static,外界就必须创建一个对象,显然这里是不容许的
15     public static Student getStudent() {
16         return s;//这里是原子性操作,不是多条语句操作共享数据,所以开发的时候,我们用饿汉式,会比较安全(开发时候会常涉及到多线程)
17     }
18 }

 测试类:

 1 package cn.itcast_03;
 2 
 3 /*
 4  * 单例模式:保证类在内存中只有一个对象。
 5  * 
 6  * 如何保证类在内存中只有一个对象呢?
 7  *         A:把构造方法私有
 8  *         B: 在成员位置自己创建一个对象
 9  *         C: 通过一个公共的方法提供访问
10  */
11 public class StudentDemo {
12     public static void main(String[] args) {
13         // Student s1 = new Student();
14         // Student s2 = new Student();
15         // System.out.println(s1 == s2); // false
16 
17         // 通过单例如何得到对象呢?
18 
19         // Student.s = null;
20 
21         Student s1 = Student.getStudent();
22         Student s2 = Student.getStudent();
23         System.out.println(s1 == s2);
24 
25         System.out.println(s1); // null,cn.itcast_03.Student@175078b
26         System.out.println(s2);// null,cn.itcast_03.Student@175078b
27     }
28 }

 

2. 单例模式之懒汉式

 1 package cn.itcast_03;
 2 
 3 /*
 4  * 单例模式:
 5  *         饿汉式:类一加载就创建对象
 6  *         懒汉式:用的时候,才去创建对象
 7  * 
 8  * 面试题:单例模式的思想是什么?请写一个代码体现。
 9  * 
10  *         开发:饿汉式(是不会出问题的单例模式)
11  *         面试:懒汉式(可能会出问题的单例模式)
12  *             A:懒加载(延迟加载)    
13  *             B:线程安全问题
14  *                 a:是否多线程环境    是
15  *                 b:是否有共享数据    是
16  *                 c:是否有多条语句操作共享数据     是
17  */
18 public class Teacher {
19     private Teacher() {
20     }
21 
22     private static Teacher t = null;
23 
24     public synchronized static Teacher getTeacher() {
25         // t1,t2,t3
26         if (t == null) {//多条语句操作共享数据
27             //t1,t2,t3
28             t = new Teacher();
29         }
30         return t;
31     }
32 }

测试类:

 1 package cn.itcast_03;
 2 
 3 public class TeacherDemo {
 4     public static void main(String[] args) {
 5         Teacher t1 = Teacher.getTeacher();
 6         Teacher t2 = Teacher.getTeacher();
 7         System.out.println(t1 == t2);
 8         System.out.println(t1); // cn.itcast_03.Teacher@175078b
 9         System.out.println(t2);// cn.itcast_03.Teacher@175078b
10     }
11 }

 

3. 单例模式之双重锁定: 

思路很简单,就是我们只需要同步(synchronize)初始化instance的那部分代码从而使代码既正确又很有效率。 这就是所谓的“双检锁”机制(顾名思义)。 

 1 public class Singleton{  
 2   private static Singleton single;    //声明静态的单例对象的变量  
 3   private Singleton(){}    //私有构造方法   
 4     
 5   public static Singleton getSingle(){    //外部通过此方法可以获取对象    
 6     if(single == null){           // Single Checked  
 7         synchronized (Singleton.class) {   //保证了同一时间只能只能有一个对象访问此同步块        
 8             if(single == null){   // Double Checked  
 9                 single = new Singleton();          
10         }     
11       }  
12     }    
13     return single;   //返回创建好的对象   
14   }  
15 }  

 

posted on 2015-05-18 18:43  鸿钧老祖  阅读(193)  评论(0编辑  收藏  举报

导航