一.什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。
在整个程序空间中,该类只存在一个实例对象。
其实,GOF对单例模式的定义是:保证一个类只有一个实例存在,同时提供能对实例加以访问对全局访问方法
二.为什么要使用单例模式
在应用系统开发中,
在多个线程之间,共享同一个资源或者操作同一个对象,
在整个程序空间使用全局变量,共享资源。
节省对象单创建时间。
因为在sigleton模式可以保证为一个类只生成一个唯一单实例对象,所以这些情况下单例模式可以派上用场。
代码实现一:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main1 {
public static void main(String[] args) {
Person person1=Person.getPerson();//第一个对象
Person person2=Person.getPerson();//第二个对象
person1.setName("张三");
person2.setName("李四");
System.out.println(person1.getName());
System.out.println(person2.getName());
//结果是
//张三
//李四
//通过get就知道是同一个对象。
}
}
因为上述是通过构造方法来实例化对象。
假设把构造函数私有化。–就不能通过new来创建对象。
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person getPerson(){
return new Person();
}
}
public class Main1 {
public static void main(String[] args) {
Person person1=Person.getPerson();//第一个对象
Person person2=Person.getPerson();//第二个对象
person1.setName("张三");
person2.setName("李四");
System.out.println(person1.getName());
System.out.println(person2.getName());
//结果是
//张三
//李四
//通过get就知道是同一个对象。
}
}
发现还不是一个对象。
饿汉式:
public class Person {
private String name;
private static Person person=new Person();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person getPerson(){
return person;
}
}
懒汉式:
饿汉式和懒汉式比较
饿汉式,在类加载的时候只有一份,
懒汉式,在单线程是可以保证,
在多线程饿汉式可以保证,懒汉式不可以保证。
当第一个线程进来指向为空,实例化对象,在实例化的时候,第2个线程刚刚来,发现为空。然后就返回回去,相当于两个对象返回。
对懒汉式进行同步,因为多线程带来的问题。
多线程方式,加一个synchronized,相当于加锁,这样线程可以独占。这样确保线程处于临界区。
双重检查。
这样比同步方式还要效率好。这样先判断实例是否存在,不存在再加锁处理。不需要每个都进行判断。
当有两个线程,这样只有一个线程进入,另外一个在排队。其中一个出去,另外一个才能进去。
分享到此为止,希望大家对代码有问题或者想讨论的,可以联系我。qq:893564413