Java 單例模式的實現資料整理_java

來源:互聯網
上載者:User

Java單例模式的實現,對java 單例模式的幾種實現方法進行了整理:

單例模式好多書上都是這麼寫的:

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

  但是實際開發中是不會這麼寫的,因為有一個嚴重的問題,多線程並發訪問的時候,可能會產生多個執行個體!!

下面列舉幾個常用的方法:

1.使用synchronized 關鍵字

package singleton; public class SingleTon1 {        private SingleTon1(){       }   private static SingleTon1 instance = null;     //多線程問題解法一,但是效率不高!因為每次調用都會加鎖!  public static synchronized SingleTon1 getInstance(){    if(instance == null){      instance = new SingleTon1();    }    return instance;  }  public void print(){    System.out.println("thread_id:"+Thread.currentThread().getId());  }     private static Object object = new Object();  //很巧妙的方法,只有在null的時候加鎖,之後就不加啦  public static SingleTon1 getInstance2(){         if(instance == null){      synchronized (object){        instance = new SingleTon1();      }    }    return instance;  } }

 2.加鎖

package singleton; import java.util.concurrent.locks.ReentrantLock; public class SingleTon2 {     private SingleTon2(){       }  private static ReentrantLock lock = new ReentrantLock();  private static SingleTon2 instance = null;        public void print(){    System.out.println("thread_id:"+Thread.currentThread().getId());  }     public static SingleTon2 getInstance2(){         if(instance == null){      lock.lock();      if(instance == null){ //注意這裡還要判斷下!!        instance = new SingleTon2();      }      lock.unlock();    }    return instance;  }}

  3.利用靜態變數:

package singleton;  public class SingleTon3 {     public static void print(){    System.out.println("thread_id:"+Thread.currentThread().getId());  }     public static Nested getNested(){       return Nested.instance;  }  //這個是單例建立的類  static class Nested{   private Nested(){    }  static Nested instance = new Nested();  }}

以上就是常用的建立單例的模式:

Test測試代碼:

package singleton; import singleton.SingleTon3.Nested; public class Test2 {   public static void main(String[] args) {    // TODO Auto-generated method stub    Nested singleton;    Myrunnable mm = new Myrunnable();    Myrunnable m1 = new Myrunnable();         Myrunnable2 m2 = new Myrunnable2();    new Thread(m1).start();    new Thread(m2).start();    if(m1.singleton == m2.singleton){ //是同一個      System.out.println("是同一個");    }else{      System.out.println("不是同一個");    }   }}  class Myrunnable implements Runnable{    Nested singleton;      @Override      public void run() {        // TODO Auto-generated method stub        singleton = SingleTon3.getNested();        SingleTon3.print();      }  }     class Myrunnable2 implements Runnable{    Nested singleton;    @Override    public void run() {      // TODO Auto-generated method stub      singleton = SingleTon3.getNested();      SingleTon3.print();    }  }

輸出:

是同一個

thread_id:11
thread_id:10

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.