什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
实现步骤
- 饿汉式
- 直接在类装载时就实例化,然后通过静态方法返回,这样没有线程安全的问题,
public class Person {
private String name;
public static final Person person = new Person();
//构造函数私有化
private Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person getPerson(){
return person;
}
}
- 懒汉式
- 在静态方法中做判断,如果对象没有创建,就新建,如果已经创建就返回,这样做会有线程安全的问题。
public class Person2 {
private String name;
private static Person2 person;
//构造函数私有化
private Person2(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person2 getPerson(){
if(person == null){
person = new Person2();
}
return person;
}
}
- 如果想要实现线程安全,则需要在getPerson方法上加锁synchronized
public class Person3 {
private String name;
private static Person3 person;
//构造函数私有化
private Person3(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static synchronized Person3 getPerson(){
if(person == null){
person = new Person3();
}
return person;
}
}
- 双重检查
- 由于懒汉模式加上锁后,整个getPerson方法都被锁起来了,效率低,所以只需要Person4上锁,这样也不能保证线程安全,所以还需要加一个判断,实现双重检查
public class Person4 {
private String name;
private static Person4 person;
//构造函数私有化
private Person4(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person4 getPerson(){
if(person == null){
synchronized(Person4.class){
if(person == null){
person = new Person4();
}
}
}
return person;
}
}