单例设计模式:保证当前类有且仅有一个对象,不允许被创建多个实例
分类:饿汉式、懒汉式
实现思路:构造函数私有化
声明一个本类对象静态引用
提供获取当前实例的静态方法
/**
*单例模式基本思想:在类里面将构造方法私有化,在类里面提供类唯一的对象,
* 创建一个方法,该方法返回的就是这个对象(单例模式只能用于单线程,
* 如果有多个线程同时调用类的方法来构造对象,那么它构造的对象可能就不是同一个;
* 因此要给返回对象的那个方法加synchronized关键字,防止一个线程在创建对象的时候
* 另一个线程也在创建该对象)
*/
单例模式之类图:
饿汉式浅析:
package SingleExampleModel1;
public class Student {
public String name;
//1.构造方法私有化
private Student(){}
//提供唯一对象
private static Student student = new Student();
//提供一个get实例函数,返回对象
public static Student getInstance(){
return student;
}
}
package SingleExampleModel1;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Student stu1 = Student.getInstance();
stu1.name = "aaa";
Student stu2 = Student.getInstance();
stu1.name = "bbb";
Student stu3 = Student.getInstance();
stu1.name = "ccc";
}
}
浅析单例模式之懒汉式(多线程问题):
package SingleExampleModel;
public class Student {
public String name;
//1.构造方法私有化
private Student(){}
private Student(String name){
this.name = name;
}
//2.提供唯一的对象
private static Student stu;
//3.提供一个get实例的函数
public static synchronized Student getInstance(String n){
if(stu==null){
stu = new Student(n);
}
return stu;
}
}
测试类:
package SingleExampleModel;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
new Thread(){
public void run() {
Student stu = Student.getInstance("abc");
};
}.start();
new Thread(){
public void run() {
Student stu1 = Student.getInstance("abc");
};
}.start();
new Thread(){
public void run() {
Student stu2 = Student.getInstance("abc");
};
}.start();
}
}