java中的单例设计模式
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或 文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。
单例模式:
饿汉式:类一加载就创建对象
懒汉式:用的时候,采取创建对象
1.懒加载思想,延迟加载用的时候采取加载
2.线程安全问题
a.是否是多线程模式 是
b.是否有共享数据 是,就一个对象
c.是否有多条语句操作共享数据 是在判断对象是否为null是是就创建对象使用在if语句,在该语句执行处有可能被其他线程直接抢到。
//-------------------------------------------------代码分割线
1 public class Teacher { 2 // 构造私有不能创建对象 3 private Teacher() { 4 5 } 6 7 // 类一加载不再直接创建对象,而是先赋值为null 8 private static Teacher t = null; 9 10 // 通过方法创建对象 11 public synchronized static Teacher getTeacher() { 12 // 假设有三条线程,t1,t2,t3要执行此处的代码块, 13 if (t == null) { 14 // 首先t1抢到线程,创建一个对象,此时t2抢到进来后也会创建一个对象,然后t3又抢到了t3也创建了一个对象,单个对象肯定是不符合要求的 15 // 为了保证创建一次对象后就不在创建对象,对象在创建的时候其它线程是进不来的,,,将方法同步~ 16 t = new Teacher(); 17 } 18 return t; 19 } 20 }
//下面的类是测试,
1 public class TeacherDemo { 2 public static void main(String[] args) { 3 Teacher t1 = Teacher.getTeacher(); 4 Teacher t2 = Teacher.getTeacher(); 5 System.out.println(t1 == t2); //true,说明是同一个对象 6 7 } 8 }
//=====================================//
//下面的是单利饿汉式
1 public class Student { 2 // 构造私有 3 private Student() { 4 } 5 6 // 自己造一个 7 // 静态方法只能访问静态成员变量,加静态 8 // 为了不让外界直接访问修改这个值,加private 9 private static Student s = new Student(); 10 11 // 提供公共的访问方式 12 // 为了保证外界能够直接使用该方法,加静态 13 public static Student getStudent() { 14 return s; 15 } 16 }
1 /* 2 * 单例模式:类在内存中只有一个对象 3 * 如何保证呢? 4 * 1.构造方法私有 5 * 2.在成员位置自己创建一个对象 6 * 3.通过一个公共的方法提供访问 7 * 在jdk中有一个类Runtime,就是采用单例模式的饿汉式写的。 8 */ 9 public class StudentDemo { 10 public static void main(String[] args) { 11 // 获得对象 12 // Student s1 = new Student().getStudent(); 13 // Student s2 = new Student().getStudent(); 14 Student s1 = Student.getStudent(); 15 Student s2 = Student.getStudent(); 16 System.out.println(s1 == s2); 17 System.out.println(s1); 18 System.out.println(s2); 19 } 20 }
//===========================//
// Runtime的简单介绍
1 import java.io.IOException; 2 3 /* 4 * Runtime类封装了运行时的环境。 5 * 每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。 6 * 一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例, 7 * 但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。 8 * 一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。 9 * 常见的应用有 10 * 1:执行外部程序(调用外部命令) 11 * 2:内存管理 12 */ 13 14 /** 15 * 该类的设计模式是饿汉式 16 * 每个 Java 应用程序都有一个 Runtime 类实例, 使应用程序能够与其运行的环境相连接。 17 * 可以通过 getRuntime方法获取当前运行时。 18 */ 19 public class RuntimerDemo { 20 public static void main(String[] args) throws IOException { 21 Runtime r = Runtime.getRuntime(); 22 //r.exec("winmine"); 23 //调用DOS命令执行一些操作。 24 r.exec("notepad"); //直接在控制台打开记事本 25 r.exec("shutdown"); //定时关机 26 27 } 28 }
开始在code,我的个人特色。