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

首頁 > 編程 > Java > 正文

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽水市| 怀远县| 伊金霍洛旗| 馆陶县| 阿瓦提县| 若尔盖县| 吉安县| 东兴市| 五河县| 咸宁市| 武邑县| 宁都县| 江城| 铁力市| 平阳县| 郁南县| 余庆县| 江陵县| 夹江县| 宁乡县| 台州市| 湄潭县| 汽车| 黎平县| 兴国县| 武汉市| 贞丰县| 阿拉善左旗| 淄博市| 麻阳| 荥阳市| 凤翔县| 尼勒克县| 壶关县| 多伦县| 新河县| 开阳县| 万全县| 东阿县| 措勤县| 木里|