单例设计模式:一个类中只有一个对象的情况
思路:
- 将构造函数私有化 è 不能创建对象
- 在本类中创建一个对象
- 让对象对外提供一个方法,即建立一个方法对外可以获取该对象
class Student 恶汉式:先初始化对象(开发多用)
{
//私有构造函数,让其不能创建对象
Student()
{}
//创建一个最终对象
private static Student student=new Student();
//提供公共方法,让其可以获取这个对象
public static Student sigleStudent() { //一进内存就已经创建对象
return student;
}
}
class Student // 对象是方法调用才建立也叫做对象的延时加载————-懒汉式
{
//私有构造函数,让其不能创建对象
Student()
{}
//创建一个最终对象
private static Student student = null;
//提供公共方法,让其可以获取这个对象
public static Student sigleStudent() { Synchronized
if (student==null) {
student=new Student();
}
return student;
//student进内存时,对象还没有存在,只有调用getInstance时,才建立对象
}
}
单例模式在多线程下的应用:
class Student {
private static Student s=null;
private Student(){} //私有构造函数,让其不能创建对象
public static Student getInstance() {
if (s==null) {
synchronized (Student.class) {
if (s==null) {
s=new Student();
}
}
}
return s;
}
}
由图可以看出:
注意点:同步函数被静态修饰后,使用的锁是类名.class(字节码),
1、静态进内存时,内存中无本类对象
2 、静态方法中不可以定义this、super等关键字作为锁对象,但是可以采用该类的字节码,该字节码也是 一个对象,而且唯一,字节码后期学习反射就可以知道。
总结:懒汉式在多线程下是多么的低效,故我们在开发中尽量采用饿汉式单例模式。