国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java單例模式實現的幾種方式

2019-11-26 13:48:27
字體:
來源:轉載
供稿:網友

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

以上就是對Java 單例模式的資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安平县| 定兴县| 台东县| 淮滨县| 秦皇岛市| 青川县| 唐山市| 宁陕县| 贵港市| 黔东| 辽阳县| 涿鹿县| 南澳县| 江山市| 青岛市| 蒙阴县| 曲阳县| 莱阳市| 林西县| 黄石市| 镇原县| 孝义市| 永福县| 渝中区| 南和县| 凤阳县| 沈丘县| 临澧县| 杭锦旗| 渝中区| 荆州市| 综艺| 普宁市| 四平市| 同仁县| 德惠市| 临朐县| 资阳市| 天峨县| 连平县| 伊川县|