日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 系統 > Android > 正文

Android中單例模式的一些坑小結

2019-10-21 21:25:06
字體:
來源:轉載
供稿:網友

前言

單例模式最初的定義出現于《設計模式》(艾迪生維斯理, 1994):“保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。”

而我對單例的理解是,在可控的范圍內充當全局變量的作用,就相當于C語言中一個全局結構體。

首先來看這樣一個單例,稍微有點經驗的同學可能都會說,這樣的單例是非線程安全的。要加個volatile關鍵字才可以。

 class Singleton{  private static Singleton singleton;  private Singleton(){};  public static Singleton getInstance()  {   if (singleton==null)   {    synchronized (Singleton.class)    {     if (singleton==null)     {      singleton=new Singleton();     }    }   }   return singleton;  } }

但是你要是問他,為什么是非線程安全的單例就答不出來了。搞清楚這個問題其實 對我們的多線程理解是很有好處的。
我們首先明確一下對于jvm來說,完成對一個變量的寫操作 到底是如何進行的。

寫操作:

(1)先把值寫入cpu的高速緩存cache中。(2)然后再把這個cache中的值拷貝到ram(也就是我們的內存)中。

注意啊,對于一個寫操作來說,這個(1)(2) 可不是原子操作,很有可能(1)執行完畢以后,cpu又去干了其他事情,
并沒有第一時間把cache的值 寫入到ram中。而我們讀操作,都是從ram中去讀取一個值的。

所以這里我們可以想一下,如果是多線程場景的話,會有一些坑。

然后再說一個概念,對于 singleton=new Singleton(); 這一條語句來說,他顯然不是一條指令就可以完成的。

正常情況來說,我們要完成這條語句涉及到的指令大約如下:

1.申請一段堆內存空間

2.在這個堆內存空間中把我們需要的對象初始化完畢

3.把singleton這個引用指向我們的堆內存空間地址。

但是坑爹就坑爹在,虛擬機會有一個指令重排序的概念。當虛擬機發現單線程下 指令的順序變更不會導致結果異常的時候
就會觸發指令重排序的機制, 他會導致上述的 123順序發生變更,比如我們把順序改成132 你就會發現 結果還是一樣的。

(指令重排序的觸發機制準確的來說是happens before原則 有興趣的同學可以深挖)

如果發生132的執行順序 會發生什么?

假設線程a 進入到了同步代碼塊中,這個時候觸發了指令重排序,順序變成132,假設cpu這個時候執行了13。然后轉頭
去執行線程b,線程b 進入getInstance方法的時候,他發現singleton 不是null了,于是歡天喜地的return了,
但是要知道這個時候線程a的 2還沒執行,也就是說singleton雖然不是空,但是他指向的地址空間里面啥都沒有,對象還沒有初始化。所以這是一個非常大的隱患,雖然他發生的概率極低,低到我現在都沒有復現過這種現象,但是依舊有概率。

那么正確的寫法:

  class Singleton{  private static volatile Singleton singleton;  private Singleton(){};  public static Singleton getInstance()  {   if (singleton==null)   {    synchronized (Singleton.class)    {     if (singleton==null)     {      singleton=new Singleton();     }    }   }   return singleton;  } }

有很多人就會說 volatile 這個關鍵字以后,singleton=new Singleton(); 就不會發生指令重排了,所以這么做是正確的。

現在明確的告訴你,上面這個觀點是錯誤的

singleton=new Singleton();  這條語句背后的指令依舊有概率發生指令重排,只不過 volatile修飾過以后,在 這條語句背后的指令完全執行完畢以前,對singleton這個引用的讀操作全部被屏蔽了。

也就是說 132的執行順序依舊會發生,只不過 當執行完13 而2沒有執行的時候,volatile修飾過的這個變量,所有對他的讀操作
都會暫時屏蔽,等待2操作執行完以后,才會進行讀操作。

這才是volatile關鍵字加上去以后的作用。

android很多代碼比如eventbus的單例就是用的上述寫法。

當然了,上述寫法是典型的懶漢寫法,所謂懶漢你就理解成用的時候才實例化,不用的話不實例化。

但是如果你的需求是這個單例無論在什么情況下都會存在,你當然可以寫成餓漢,餓漢的寫法更簡單。

缺點就是他會一直占用內存。餓漢寫法很多,我寫個最簡單的:

 class Singleton {  //最簡單的寫法就是這個了,直接public就行  public static final Singleton instance = new Singleton();  private Singleton() {  } }

單例序列化會破壞對象唯一性嗎?

答案是會的:

package com.wuyue.test;import java.io.*;/** * Created by 16040657 on 2019/2/12. */public class Test2 { public static void main(String args[]) {  Singleton s1 = Singleton.instance;  File f = new File("../test.txt");  try {   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));   oos.writeObject(s1);   oos.close();   ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));   Singleton s3 = (Singleton) ois.readObject();   System.out.println("s1==s3:" + (s1 == s3));  } catch (IOException e) {   e.printStackTrace();  } catch (ClassNotFoundException e) {   e.printStackTrace();  } } static class Singleton implements Serializable {  //最簡單的寫法就是這個了,直接public就行  public static final Singleton instance = new Singleton();  private Singleton() {  }//  //這個方法就可以保證序列化和反序列化得到的對象是同一個了//  private Object readResolve() {//   return instance;//  } }}

代碼比較簡單,大家可以測試一下,s1和s3就是2個不同的對象,但是如果把注釋掉的readResolve方法放開的話,你就會發現
這個問題解決了,序列化和反序列化是同一個對象了。

對外部公開提供的sdk的單例要注意些什么?

尤其是對于很多金融安全類的sdk來說,如果你這個里面有單例的話,涉及到安全性要盡可能的不被業務方hook,
其中尤其要注意的就是 有人可能會利用反射來new一個對象,破壞單例

解決這個問題也不難,

 private Singleton() {   //防止有人利用反射惡意修改   if (null != instance) {    throw new RuntimeException("dont construct more!");   }  }

項目中的單例太多,如何有效管理?

其實就拿map管理就可以了,android里面的 wms,ams 等等系統單例服務都是這樣的。你傳一個key進去 返回一個單例給你。
這個真的很有用哦,特別是大型工程,可以有效管理單例,文檔輸出就簡單許多。

 static class SingletonManager {  private static Map<String, Object> objectMap = new HashMap<>();  private SingletonManager() {  }  public static void registerService(String key, Object ins) {   if (!objectMap.containsKey(key)) {    objectMap.put(key, ins);   }  }  public static Object getService(String key) {   return objectMap.get(key);  } }

android中使用單例還要注意些什么?

最主要的就是盡量不要利用單例模式存儲傳遞數據,因為app掛在后臺的時候進程會容易被殺掉,如果回到前臺再取這個單例里的數據很容易就取到個null,所以android中寫單例的原則就是:

原則上不允許用單例模式傳遞數據,如果一定要這么做,請考慮數據恢復現場。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲素人一区二区| 免费视频最近日韩| 高清1区2区| 欧美一级日韩不卡播放免费| 在线免费91| 日本不卡高清视频一区| 日韩欧美看国产| 日韩 欧美 综合| 91精品国产自产| 日韩一二三四区| 欧美日韩午夜精品| 精品亚洲成a人片在线观看| 国产在线观看黄色| 精品网站999www| 亚洲国产一区自拍| 国产在线日韩欧美| 中文字幕在线精品| 亚洲一区视频在线观看视频| 亚洲免费在线视频一区 二区| 国产丝袜一区| 你懂的亚洲视频| 精品一二三区| 国产日韩精品久久久| 色猫猫国产区一区二在线视频| 日韩欧美三级在线| 精品国产网站在线观看| 久久在线91| 色欧美日韩亚洲| 国产一二三视频| 国产区视频在线观看| 丰满少妇一区二区| 国产一级片在线播放| 欧美sm一区| 欧美激情一区二区在线| 日韩亚洲欧美中文高清在线| 天天摸日日摸狠狠添| 亚州黄色一级| 亚洲a级在线播放观看| 国产在线观看黄色| 婷婷中文字幕一区| 在线不卡一区二区| 久久精品卡一| 在线视频第一页| 精品欧美久久久| 日韩在线视频免费观看高清中文 | 日本亚洲视频在线| 国产久卡久卡久卡久卡视频精品| 欧美 日韩 综合| 欧美日韩在线视频一区| 亚洲三级网站| 国产日产一区二区| 日韩在线三区| 亚洲经典中文字幕| 99综合视频| 中文字幕在线看精品乱码| 在线精品日韩| 亚洲一区在线观看网站| 日本熟女一区二区| 婷婷久久综合九色国产成人| 国产欧美亚洲一区| 欧美不卡视频一区| 美女在线视频一区| 日韩午夜中文字幕| 久久精品日韩欧美| 日韩欧美一二三区| 国产色综合网| 久久精品欧美日韩精品| 亚洲免费中文字幕| 日韩欧中文字幕| 婷婷中文字幕综合| 日韩亚洲欧美中文在线| 国产成人精品999| 免费在线亚洲| 精品视频—区二区三区免费| 日韩精品免费视频一区二区三区| 中文欧美日韩| 精品久久久视频| 亚洲成av人片| 国产日韩第一页v| 久久99久久久久久久噜噜| 日本一欧美一欧美一亚洲视频| 国产婷婷色一区二区三区在线| 国内不卡的二区三区中文字幕| 中文av字幕一区| 精品人妻二区中文字幕| 亚洲一区精品电影| a视频在线播放| 黄色片免费看| 在线精品观看| 欧美在线视频二区| 在线观看一区| 欧美日韩免费精品| 日韩中文字幕视频网| 不卡视频一区二区三区| 国产一级免费看| 精品日韩视频| 91精品国产99| 久久99精品久久久久婷婷| 精品国产乱码一区二区| 久久久另类综合| 999精品网| 一本久久a久久精品亚洲| 中文字幕在线播放一区| 国产婷婷精品| 成人久久在线| 日韩亚洲一区中文字幕| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 日韩精品欧美在线| 久久婷婷国产| 亚洲精华国产欧美| 天堂在线www天堂中文在线| 日韩亚洲欧美中文高清在线| 中文字幕在线日韩| 亚洲黄色在线观看| 久久精品免费看| 在线黄色国产电影| 日韩在线视频在线观看| 国产久卡久卡久卡久卡视频精品| 国产在线黄色| 日韩一级中文字幕| 精品中文字幕视频| 国产视频aaa| 一区二区三区在线播放视频| 欧美一级日韩一级| 国产日韩精品久久久| 国产欧美综合在线观看第十页| 久久人人88| 中文亚洲免费| 国产乱国产乱300精品| 亚洲第一中文字幕| 中文字幕欧美亚洲| 日韩精品三级| 欧美日韩国产在线看| 精品国产免费视频| 国产午夜精品视频| 欧美日韩国产黄色| 日本免费看黄| 一区二区中文字幕在线| 国产日韩精品电影| 在线看av的网址| 国产在线不卡一区| 日本亚洲欧美三级| 91xxx在线观看| 色综合天天性综合| 欧美日韩国产一二| 久久久久久自在自线| 免费在线观看国产黄| 国产黄色精品| 韩国v欧美v日本v亚洲| 一级片免费在线| 欧美日韩亚洲视频| 亚洲图片小说综合| 欧美日韩精品综合在线| 亚洲女人天堂a在线播放| 国产婷婷精品| 亚洲欧美久久234| 欧美日韩国产免费观看视频| 一本一道久久a久久精品综合蜜臀| 99精品免费观看| 欧美精品一区二区三区在线播放| 亚洲永久免费视频| 欧美人妻一区二区三区| 色综合久久六月婷婷中文字幕| 欧美一级在线观看| 精品久久电影| 日韩国产成人| 国产专区中文字幕| 在线免费播放av| 精品国产31久久久久久| 精品在线网站观看| 亚洲社区在线| 国产男女av| 999精品网| 国产专区中文字幕| 国产小视频免费在线网址| 欧美中文字幕视频在线观看 | 亚洲高清在线观看一区| 国产一区在线观看视频| 欧美特黄一区| 在线视频观看日韩| 欧美国产中文| 日韩免费高清一区二区| 人成免费在线视频| 午夜一区二区视频| 大香一本蕉伊线亚洲网| 国产小视频在线观看免费| 欧美日韩高清在线| 欧美日韩国产不卡在线看| www.精品av.com| 亚洲一区在线观看视频| 一二三区精品福利视频| 国产福利一区二区| 中文字幕欧美日韩在线| 国产成人精品三级| www..com日韩| 国产一级久久久| 国产www.大片在线| 精品在线91| 欧美日韩中国免费专区在线看| 欧美一级日韩不卡播放免费| 欧美亚洲另类制服自拍| 久久精品久久精品国产大片| 日韩精品视频免费播放| 国产91一区| 欧美日韩一二三四| 亚洲一区在线观看网站| 日韩免费精品视频| 国产激情99| 国产一区不卡精品| 国产99对白在线播放| 九色蝌蚪视频在线| 日韩精品视频在线免费观看| 91精品国产全国免费观看| 国产视频三级在线观看播放| 亚洲人成欧美中文字幕| 欧美 日韩 中文字幕| 久久99蜜桃精品久久久久小说| 欧美久久久网站| 99在线精品视频免费观看20| 日韩激情一区| 精品人妻二区中文字幕| 日韩精品a在线观看91| 日韩.欧美.亚洲| 国产成人精品网址| 日韩中文欧美在线| 国产一级免费在线观看| 色综合久久88色综合天天免费| 国产永久免费高清在线观看| www高清在线视频日韩欧美| 精品视频—区二区三区免费| 国产在线高潮| 欧美日韩在线中文字幕| 国产一级片在线| 91精品在线视频观看| 久久久99久久精品欧美| 亚洲女人天堂色在线7777| 日韩欧美看国产| www.狠狠| 欧美日韩亚洲国内综合网| 日韩精品综合在线| 亚洲免费视频一区| 国产精品一区二区三区免费观看| aaa欧美日韩| 日韩区欧美区| 精品国产99| 精品国产欧美日韩| 国产不卡一区| 欧美日韩综合在线免费观看| 日韩一级免费在线观看| 欧美日韩三级一区| 国产欧美久久久| 免费精品国产自产拍在| 精品久久蜜桃| 精品日韩av| 欧美高清一区| 欧美日韩精品欧美日韩精品一| 日韩一级二级三级精品视频| 日韩精品福利视频| 精品全国在线一区二区| 日韩精品一页| 欧美日韩国产影片| 黄色在线播放网站| 日韩欧美国产一二三区| 日韩中文在线视频| 中文字幕在线观看国产| 亚洲丝袜一区| 欧美日韩成人综合| 国产区视频在线观看| 精品视频www| 一级特黄aaa大片在线观看| 欧美不卡视频| 欧洲精品久久久| 首页国产欧美久久| 欧美 日韩 国产在线观看| 在线中文字幕视频| 日韩在线视频一区| 美女尤物久久精品| 日韩欧美亚洲区| 红桃视频国产一区| 久久久99免费| 日韩欧美综合| 一级特黄aaa大片在线观看| 亚洲第一视频| 日韩三级视频在线| 久久夜色精品国产欧美乱极品| 在线中文字幕网站| 不卡视频一区二区| 欧美日韩在线播放三区四区| 国产一区高清视频| 91蜜桃婷婷狠狠久久综合9色| 国产三级视频在线播放线观看| 中文字幕精品在线| 91精品电影| 激情国产在线| 91精品国产高清91久久久久久| 在线欧美日韩精品| 日韩欧美专区在线| 午夜亚洲一区| 久久91精品视频| 二区中文字幕| av中文天堂在线| 亚洲国产午夜精品| 久久精品国产视频| 久久久精品福利| 亚洲福利精品视频| 中文字幕欧美日韩在线不卡| 在线视频第一页| 中文字幕在线观看视频www| 日韩不卡av| 日韩美女中文字幕| 久久精品www| www.老鸭窝.com| 在线亚洲免费| 国产又粗又猛又爽又黄91精品| 日韩欧美综合在线视频| 精品色蜜蜜精品视频在线观看| 日韩欧美在线视频| 欧美日韩视频免费播放| 欧美三级日韩三级| 亚洲乱码在线观看| 日韩精品视频网站| 欧美日韩999| 国产三级做爰在线观看| 精品成a人在线观看| 亚洲欧洲日产国码av系列天堂 | 国产成人精品日本亚洲专区61| 欧美另类久久久品| 丰满少妇一区二区| 国产丝袜一区| 欧美一级日韩不卡播放免费| 99在线精品视频免费观看20| 国产免费电影网站入口| 一区二区三区在线免费| 国产主播中文字幕| 中文字幕亚洲二区 | 一区二区三区在线播放欧美| 亚洲.国产.中文慕字在线| 欧美二区在线观看| 亚洲中文字幕在线一区| 欧美日韩在线不卡| 午夜一区二区三区免费| 亚洲国产一区自拍| 日韩欧美一级视频| 中文字幕欧美亚洲| 日韩欧美字幕| 91精品综合久久| 日韩欧美国产综合| wwww亚洲| 日韩欧美成人一区二区三区| 日韩精品一级| 午夜国产在线视频| 91久久精品在线| 亚洲经典中文字幕| 日韩三级视频在线看| 久久视频一区| 91精品观看| 亚洲视频电影在线| 中文亚洲欧美| 麻豆精品99| 国产福利一区二区| 国产裸体歌舞团一区二区| 国产亚洲视频中文字幕视频| 久久精品在线观看| 亚洲一区日韩精品中文字幕| 欧美日韩国产首页在线观看| 日韩视频 中文字幕| 国产成人精品亚洲| www中文字幕在线观看| 一级一片免费视频| 九九视频精品免费| av免费观看国产| 国产日韩中文字幕| 91最新在线| 国产 欧美在线| 三级网站免费观看| 在线视频国产三级| 久久精品夜夜夜夜久久| 国产日韩精品在线| 国产成人精品综合网站| 国产亚洲视频中文字幕视频| 日韩欧美999| 亚洲丝袜一区| 亚洲高清视频一区| 日韩专区视频网站| 日本一级一片免费视频| 日韩精品视频在线免费观看| 久久精品日韩无码| 精品视频久久| 91麻豆免费视频网站| 一区免费在线| 久久 天天综合| 国产欧美日韩亚洲| 免费在线亚洲| a在线观看免费视频| 精品日韩在线观看| 91精品国产全国免费观看| 在线国产三级| 一二三区精品视频| 亚洲深夜福利| 日韩在线视频在线观看|