所谓单例,即使单一的实例,就是要保证对象只有一个。
单例模式:单一的实例,保证类在内存中的只有一个对象。
举例:windows的打印服务,网站计数器
java的应用:Runtime
2.如何保证类在内存中只有一个对象?
A:把构造器方法私有,为了不让外界创建对象
B:在类中去创建一个对象
C:通过一个公共的访问方式给外界提供一个入口
单例模式,分饿汉式或懒汉式。
下面请看饿汉式
package cn.itcast_singleton; public class Student { //为了不让外界访问,我们把构造器方法私有 private Student(){}; //创建一个对象 //为了满足静态方法访问,这里必须加一个静态修饰符 //为了不让外界修改s对象,加私有修饰 private static Student s=new Student(); //提供一个公共的访问方式 //为了让外界直接访问,我们就给方法添加一个静态修饰符 public static Student getStudent(){ return s; } public void show(){ System.out.println("i love java"); } } package cn.itcast_singleton; public class StudentTest { public static void main(String[] args){ // Student s1=new Student(); // Student s2=new Student(); // System.out.println(s1==s2); //由于成员变量是被静态修饰的,所以外界也可以通过类名访问 //Student.s=null; //通过单利模式获取对象并调用方法 Student s1=Student.getStudent(); Student s2=Student.getStudent(); System.out.println(s1==s2); s1.show(); s2.show(); } }
再看 懒汉式
懒汉式单例模式:
延迟加载思想:我们什么时候需要对象,你什么时候给我对象就可以了。(Hibernate,Spring)
第一次访问的时候去创建,, 第二次去访问是不创建的
package cn.itcast_singleton; public class Teacher { //为了不让外界创建对象,把构造方法私有 private Teacher(){} //本来创建一个对象 //加static 是为了保证静态方法可以访问 //夹private是为了保证外界不能直接访问 private static Teacher t=null; //提供公共访问的方式 public static Teacher getTeacher(){ //比如说我有t1和t2同时来访问,那么,这个时候, //当t1进来后,判断这个t是null, //所以,t1就进去执行if所控制的语句 //但是注意了,由于线程的随机性,可能t1刚进去要执行if所控制的语句 //这个时候,被t2抢到的CPU的执行权,者古时候,t2就开始执行了 //发现,这个时候还是null,所以,t2也进去执行if所控制的语句了 //那么,会有多个对象被创建 //Runtime if(t==null){ t=new Teacher(); } return t; } //写了一个方法 public void show(){ System.out.println("老师爱林青霞"); } } package cn.itcast_singleton; public class TeacherTest { public static void main(String[] args) { // Teacher t1=new Teacher(); // Teacher t2=new Teacher(); Teacher t1=Teacher.getTeacher(); Teacher t2=Teacher.getTeacher(); t1.show(); t2.show(); } }
那么,我们在开发中到底用到谁呢?
一般我们开发中采用第一种方案 也就是饿汉式
原因:
前提:多线程安全问题
面试的时候,会面试懒汉式。
并且 请注意,面试懒汉式主要是面试一下几个问题:
A:延迟加载思想 啥时用,啥时再创建
B:线程安全
a.线程安全问题是怎么产生的。
b.现在安全问题是怎么解决的。
6:其实在JDK提供的类中,已经有单例模式的应用,是谁呢?Runtime类
从这个类的源码中,可以看出
开发中用的是饿汉式
来源:https://www.cnblogs.com/vinplezhang/p/3660551.html