zoukankan      html  css  js  c++  java
  • 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 }  
  • 相关阅读:
    PCA (主成分分析)详解 (写给初学者) 结合matlab(转载)
    解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)
    主成分分析(PCA)原理详解(转载)
    神经网络的6种有监督训练算法
    PyCharm下载与激活
    matlab中元胞数组的创建与内容读取
    创新式开发探索(四) —— 探索式学习
    耐心,细心,贴心,静心
    使用 JsPlumb 绘制拓扑图的通用方法
    使用 amcharts 和 highcharts 绘制多曲线时间趋势图的通用方法
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4512777.html
Copyright © 2011-2022 走看看