一、什麼是單例模式
單例模式是一種對象建立型模式,使用單例模式,可以保證為一個類隻生成唯一的執行個體對象。也就是說,在整個程式空間中,該類隻存在一個執行個體對象。
其實,GoF對單例模式的定義是:保證一個類、隻有一個執行個體存在,同時提供能對該執行個體加以通路的全局通路方法。
二、為什麼要使用單例模式呢?
在應用系統開發中,我們常常有以下需求:
- 在多個線程之間,比如servlet環境,共享同一個資源或者操作同一個對象
- 在整個程式空間使用全局變量,共享資源
- 大規模系統中,為了性能的考慮,需要節省對象的建立時間等等。
因為Singleton模式可以保證為一個類隻生成唯一的執行個體
對象,是以這些情況,Singleton模式就派上用場了。
三、單例模式實作
1.餓漢式:
[java]
package com.qianyan.singleton;
public class Person {
private static final Person person = new Person();
private String name;
//構造方法私有化
private Person(){
}
//建立一個全局可通路的靜态方法
public static Person getInstance(){
return person;
public String getName() {
return name;
public void setName(String name) {
this.name = name;
}
2.懶漢式(非線程安全,在多線程下有問題):
[java]
public class Person1 {
private static Person1 person;
//私有化構造方法
private Person1(){
public static Person1 getInstance(){
if(person == null)
return new Person1();
線程安全(效率低):
public class Person2 {
private static Person2 person;
private Person2(){
//建立一個全局可通路的靜态方法,使用同步方法
public static synchronized Person2 getInstance(){
person = new Person2();
3.雙重檢查:
public class Person3 {
private static Person3 person;
private Person3(){
public static Person3 getInstance(){
synchronized(Person3.class){
if(person == null)
person = new Person3();
}
測試類:
public class MainClass {
public static void main(String[] args) {
/*Person p1 = Person.getInstance();
p1.setName("zhangsan");
Person p2 = Person.getInstance();
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());*/
/*Person1 p1 = Person1.getInstance();
Person1 p2 = Person1.getInstance();
/*Person2 p1 = Person2.getInstance();
Person2 p2 = Person2.getInstance();
System.out.println(p1);
System.out.println(p2);*/
Person3 p1 = Person3.getInstance();
Person3 p2 = Person3.getInstance();
p1.setName("zhangsan");
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());