天天看點

java建立單例模式java建立單利模式

java建立單利模式

1、為什麼要建立單利模式?

因為單例模式保證一個類中隻存在一個執行個體,有利于節省記憶體,有利于java垃圾回收

2、 常見三種單例模式的建立

1).懶漢式單例模式

public class People {
public synchronized static People getInstance(){
        if(instance==null){
            instance=new People();
        }
        return instance;
    }
    private People(){

    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           

這種寫法在getInstance()方法中加入了synchronized鎖。能夠在多線程中很好的工作,而且看起來它也具備很好的lazy loading,但是效率很低(因為鎖),并且大多數情況下不需要同步。

2).餓漢式單例模式

public class People {
  private static People instance=new People();
    private People(){

    }
    public  static People getInstance(){
        return instance;
    }
	private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    }
           

這種方式基于classloder機制避免了多線程的同步問題,不過,instance在類裝載時就執行個體化,這時候初始化instance顯然沒有達到lazy loading的效果。

3).靜态類部類模式

public class People {
 private static class Instance{
        private static People instance=new People();

    }
    public  static People getInstance(){
        return Instance.instance;
    }



    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    }
           

這種方式同樣利用了classloder的機制來保證初始化instance時隻有一個線程,它跟第二種不同的是(很細微的差别):第二種是隻要Singleton類被裝載了,那麼instance就會被執行個體化(沒有達到lazy loading效果),而這種方式是Singleton類被裝載了,instance不一定被初始化。因為SingletonHolder類沒有被主動使用,隻有顯示通過調用getInstance方法時,才會顯示裝載SingletonHolder類,進而執行個體化instance。想象一下,如果執行個體化instance很消耗資源,我想讓他延遲加載,另外一方面,如果不希望在Singleton類加載時就執行個體化,因為不能確定Singleton類還可能在其他的地方被主動使用進而被加載,那麼這個時候執行個體化instance顯然是不合适的。這個時候,這種方式相比第三方法就顯得更合理。

測試類

public class PeopleTest {
public static void main(String[] args){
People p1=People.getInstance();
        p1.setName("張三");
        People p2=People.getInstance();
        p2.setName("李四");
        System.out.println(p1.getName());
        System.out.println(p2.getName());
   }
}
           

輸出結果

java建立單例模式java建立單利模式

繼續閱讀