1.单例模式的概念和作用
单例:一个实例(对象),指一个程序运行期间,某个类最多只允许创建一个对象,这时需要将这个类设计没
2.单例模式_饿汉式 (线程安全)
public class Student {
//1.构造方法私有化
private Student(){
}
//2.定义一个私有、静态的方法,获取上面的本类对象
private static Student stu = new Student();
//3.定义一个公有、静态的方法、获取上面的本类对象
public static Student getInstance() {
return stu;
}
}
public class Test01 {
public static void main(String[] args) {
Student stu1 = Student.getInstance();
Student stu2 = Student.getInstance();
System.out.println(stu1 == stu2);
}
}
3.单例模式_懒汉式
3.1普通版(线程不安全)
public class Student {
//1.构造函数私有化
private Student() {
}
//2.定义一个本类对象的引用
private static Student stu;
//3.定义一个公有静态方法,获取成员属性
public static synchronized Student getInstance() {
if (stu == null) {
stu = new Student();
}
return stu;
}
}
public class Test01 {
public static void main(String[] args) {
Student stu1 = Student.getInstance();
Student stu2 = Student.getInstance();
System.out.println(stu1 == stu2);
}
}
3.2升级版(线程不安全)
public class LazyDoubleCheckSingleton{
private volatile static LazyDoubleCheckSingleton instance;
private LazyDoubleCheckSingleton (){}
public static LazyDoubleCheckSingleton getInstance(){
//第一次检测
if(instance == null){
//同步
synchronized(LazyDoubleCheckSingleton.class){
if(instance ==null){
// new 对象分为3步 volatile防止指令重排
// memory = allocate();//1.分配对象内存空间
// instance(memory); //2.初始化对象
// instance = memory; //3.设置instance指向刚分配的内存地址,此时instance !=null
instance = new LazyDoubleCheckSingleton();
}
}
}
return instance;
}
单例模式实现小结
- 构造方法私有化
- 定义私有、静态本类类型的成员属性
饿汉式:先创建对象;
懒汉式:不创建对象; - 定义公有、静态、线程安全的(同步)方法、返回成员属性
饿汉式:由于已经创建对象,直接返回成员属性;
懒汉式:要先判断成员属性是否为null,是创建对象,之后返回成员属性。