/*
* 单例模式:
* 饿汉式:类一加载就创建对象(太饿了,要直接给我)
* 懒汉式:用的时候,才去创建对象(太懒了,等到饿到不行了才去要对象)
*
* 面试题:单例模式的思想是什么?请写一个代码体现。
*
* 开发:饿汉式(是不会出问题的单例模式)(开发用饿汉式,详见RunTime类的源码就是饿汉式的单例模式)
* 面试:懒汉式(可能会出问题的单例模式)
* A:懒加载(延迟加载)
* B:线程安全问题(a,b,c为线程安全的三个考虑方面)
* a:是否多线程环境 是
* b:是否有共享数据 是
* 单例模式:
* 饿汉式:类一加载就创建对象(太饿了,要直接给我)
* 懒汉式:用的时候,才去创建对象(太懒了,等到饿到不行了才去要对象)
*
* 面试题:单例模式的思想是什么?请写一个代码体现。
*
* 开发:饿汉式(是不会出问题的单例模式)(开发用饿汉式,详见RunTime类的源码就是饿汉式的单例模式)
* 面试:懒汉式(可能会出问题的单例模式)
* A:懒加载(延迟加载)
* B:线程安全问题(a,b,c为线程安全的三个考虑方面)
* a:是否多线程环境 是
* b:是否有共享数据 是
* c:是否有多条语句操作共享数据 是
* 因此懒汉式中在获得单例对象getXXX( )的时要进行同步或加锁,而饿汉式的getXXX( )函数中是直接返回单例对象,为原子性操作,不需要同步或加锁
/************饿汉式****************/
package cn.itcast_03;
public class Student {
// 构造私有
private Student() {
}
// 自己造一个
// 静态方法只能访问静态成员变量,加静态
// 为了不让外界直接访问修改这个值,加private
private static Student s = new Student();//这里直接就给你造好对象了
// 提供公共的访问方式
// 为了保证外界能够直接使用该方法,加静态
public static Student getStudent() {
return s;//原子性操作,直接拿给你
}
}
/************懒汉式****************/
package cn.itcast_03;
public class Teacher {
private Teacher() {
}
private static Teacher t = null;//对象还没给你造
public synchronized static Teacher getTeacher() {
if (t == null) {
//由于CPU时间片的问题,可能 t1,t2,t3 三个线程同时进入
t = new Teacher();//等你调用getXXX()时,我再给你造对象
}
return t;
}
}
// 通过单例如何得到对象呢?
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1 == s2);//true;
*/