单例模式:类只能有一个实例。
类的特点:1、私有构造器;2、内部构造实例对象;3、对外提供获取唯一实例的public方法。
饿汉式单例特点:线程安全,不能延时加载
public class Person {
//类初始化的时候直接实例化 多线程中也可保证
public static final Person person = new Person();
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){
}
//提供一个全局的静态方法
public static Person getPerson(){
return person;
}
}
public class MainClass {
public static void main(String[] args) {
Person person = Person.getPerson();
Person person2 = Person.getPerson();
person.setName("zhangsan");
person2.setName("lisi");
System.out.println(person.getName());
System.out.println(person2.getName());
}
}
懒汉式 :对方法进行同步,但不同保证,在安全方面有欠缺
public class Person2 {
private String name;
private static Person2 person;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person2(){
}
//提供一个全局的静态方法 多线程为保证需要同步方法
public static synchronized Person2 getPerson(){
if(person ==null){
person = new Person2();
}
return person;
}
}
双重检查:对方法进行同步导致效率问题,只对核心部分进行同步
public class Person3 {
private String name;
private static Person3 person;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person3(){
}
//提供一个全局的静态方法
public static Person3 getPerson(){
if(person ==null){
synchronized (Person3.class) {
if(person ==null){
person = new Person3();
}
}
}
return person;
}
}