单例模式代码示例:
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 }