SQLiteOpenHelper
- 管理的是一個(gè)數(shù)據(jù)庫,而不是一個(gè)表
此數(shù)據(jù)庫可管理多個(gè)表,構(gòu)造函數(shù)的版本號也是數(shù)據(jù)庫版本號,不是表版本號哇 - onCreate和onUpgrade何時(shí)調(diào)用:
注意不是對象構(gòu)造時(shí)诺苹,而是調(diào)用getReadableDatabase / getWriteableDatabase時(shí),具體參考 getDatabaseLocked雹拄,其中包含onCreate和onUpgrade調(diào)用
并發(fā)概念
- 原子性
原子操作收奔,指操作期間cpu不切換線程上下文 - 可見性
多線程下,每個(gè)子線程的有自己的數(shù)據(jù)緩存滓玖,數(shù)據(jù)改變僅發(fā)生在線程緩存空間坪哄,其它線程是看不到的,只有經(jīng)過同步處理势篡,數(shù)據(jù)才會(huì)回寫到主存翩肌,并更新到其它線程的緩存中
synchronized 和 volatile
synchronized
在JVM內(nèi)部,為了提高效率禁悠,同時(shí)運(yùn)行的每個(gè)線程都會(huì)有它正在處理的數(shù)據(jù)的緩存副本念祭,當(dāng)我們使用synchronzied進(jìn)行同步的時(shí)候,真正被同步的是在不同線程中表示被鎖定對象的內(nèi)存塊(副本數(shù)據(jù)會(huì)保持和主內(nèi)存的同步碍侦,現(xiàn)在知道為什么要用同步這個(gè)詞匯了吧)粱坤,簡單的說就是在同步塊或同步方法執(zhí)行完后,對被鎖定的對象做的任何修改要在釋放鎖之前寫回到主內(nèi)存中祝钢;在進(jìn)入同步塊得到鎖之后比规,被鎖定對象的數(shù)據(jù)是從主內(nèi)存中讀出來的,持有鎖的線程的數(shù)據(jù)副本一定和主內(nèi)存中的數(shù)據(jù)視圖是同步的-
volatile
volatile關(guān)鍵字是一種簡單的同步的處理機(jī)制拦英,因?yàn)楸籿olatile修飾的變量遵循以下規(guī)則:- 變量的值在使用之前總會(huì)從主內(nèi)存中再讀取出來蜒什。
- 對變量值的修改總會(huì)在完成之后寫回到主內(nèi)存中。
但只有修改時(shí)不依賴當(dāng)前狀態(tài)(讀取時(shí)的值)的變量才應(yīng)該聲明為volatile變量
并發(fā)數(shù)據(jù)結(jié)構(gòu)
- 并發(fā)Map
ConcourrentMap 接口在Map接口基礎(chǔ)上增加了3個(gè)原子操作方法
ConcourrentHashMap 是ConcourrentMap的實(shí)現(xiàn)類疤估,內(nèi)部分為16塊分別加鎖 - 并發(fā)集合類的使用
并發(fā)集合類ConcourrentHashMap和CopyOnWriteArrayList灾常,他們在多線程環(huán)境下能保證自身狀態(tài)的一致性,但使用時(shí)铃拇,依然需要再外加同步鎖钞瀑,因?yàn)閷懖僮骺赡芤蕾囍暗臓顟B(tài)