版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JAVA高級(jí):多核線程-v olatile原理與技巧& 為什么使用volatile比同步代價(jià)更低?同步的代價(jià), 主要由其覆蓋范圍決定, 如果可以降低同步的覆蓋范圍, 則可以大幅提升 程序性能.而 volatile 的覆蓋范圍僅僅變量級(jí)別的. 因此它的同步代價(jià)很低.volatile 原理是什么?volatile 的語義, 其實(shí)是告訴處理器, 不要將我放入工作內(nèi)存, 請(qǐng)直接在主存操作我.(工 作內(nèi)存詳見 java 內(nèi)存模型)因此, 當(dāng)多核或多線程在訪問該變量時(shí), 都將直接操作主存, 這從本質(zhì)上, 做到了變量 共享.volatile 的有什么優(yōu)勢(shì)?更大的程序吞吐量更少的代碼實(shí)現(xiàn)多線程程序的伸縮性較好
2、比較好理解, 無需太高的學(xué)習(xí)成本volatile 有什么劣勢(shì)?1, 容易出問題2, 比較難設(shè)計(jì)volatile 運(yùn)算存在臟數(shù)據(jù)問題volatile 僅僅能保證變量可見性, 無法保證原子性.volatile 的 race condition 示例:public class TestRaceCondition private volatile int i = 0;public void increase() i+;public int getValue() return i;當(dāng)多線程執(zhí)行in crease方法時(shí),是否能保證它的值會(huì)是線性遞增的呢?答案是否定的.原因:這里的in crease方法,執(zhí)
3、行的操作是i+,即i = i + 1;針對(duì)i = i + 1,在多線程中的運(yùn)算,本身需要改變i的值.如果, 在 i 已從內(nèi)存中取到最新值, 但未與1 進(jìn)行運(yùn)算, 此時(shí)其他線程已數(shù)次將運(yùn)算結(jié) 果賦值給 i.則當(dāng)前線程結(jié)束時(shí), 之前的數(shù)次運(yùn)算結(jié)果都將被覆蓋.即,執(zhí)行100 次 in crease,可能結(jié)果是 100.一般來說, 這種情況需要較高的壓力與并發(fā)情況下, 才會(huì)出現(xiàn).如何避免這種情況?解決以上問題的方法:一種是 操作時(shí), 加上同步.這種方法,無疑將大大降低程序性能,且違背了 volatile的初衷.第二種方式是,使用硬件原語(CAS),實(shí)現(xiàn)非阻塞算法從CPU原語上,支持變量級(jí)別的低開銷同步
4、.CPU原語-比較并交換(CompareA ndSet),實(shí)現(xiàn)非阻塞算法什么是 CAS?cas是現(xiàn)代CPU提供給并發(fā)程序使用的原語操作.不同的CPU有不同的使用規(guī)范. 在 Intel 處理器中,比較并交換通過指令的 cmpxchg 系列實(shí)現(xiàn)。PowerPC 處理器有一對(duì)名為“加載并保留”和“條件存儲(chǔ)”的指令,它們實(shí)現(xiàn)相同的目地 MIPS 與 PowerPC 處理器相似,除了第一個(gè)指令稱為“加載鏈接”。CAS操作包含三個(gè)操作數(shù)一內(nèi)存位置(V)、預(yù)期原值(A)和新值(B) 什么是非阻塞算法?一個(gè)線程的失敗或掛起不應(yīng)該影響其他線程的失敗或掛起這類算法稱之為非阻塞(nonblocki ng)算法對(duì)比阻
5、塞算法:如果有一類并發(fā)操作, 其中一個(gè)線程優(yōu)先得到對(duì)象監(jiān)視器的鎖, 當(dāng)其他線程到達(dá)同步 邊界時(shí), 就會(huì)被阻塞.直到前一個(gè)線程釋放掉鎖后, 才可以繼續(xù)競(jìng)爭(zhēng)對(duì)象鎖.(當(dāng)然,這里的競(jìng)爭(zhēng)也可是公平的, 按先來后到的次序)CAS 原理:我認(rèn)為位置V應(yīng)該包含值A(chǔ);如果包含該值,則將B放到這個(gè)位置;否則,不要更改該位置,只告訴我這個(gè)位置現(xiàn)在的值即可。CAS使用示例(jdk 1.5并發(fā)包Atomiclnteger類分析/* Atomically sets to the given value and returns the old value.* param newValue the new value* r
6、eturn the previous value*/ public final int getAndSet(int newValue) for (;) int current = get();if (compareAndSet(current, newValue)return current;public final boolean compareAndSet(int expect, int update) return pareAndSwapInt(this, valueOffset, expect, update);&這個(gè)方法是,Atomic In teger類的常用方法,作用是,將變量設(shè)
7、置為指定值, 并返回設(shè)置前的值.它利用了 cpu原語compareAndSet來保障值的唯一性.另, AtomicInteger 類中, 其他的實(shí)用方法, 也是基于同樣的實(shí)現(xiàn)方式.比如 getAndIncrement, getAndDecrement, getAndAdd 等等.CAS語義上存在的ABA問題什么是 ABA 問題?假設(shè),第一次讀取V地址的A值,然后通過CAS來判斷V地址的值是否仍舊為A,如 果是,就將B的值寫入V地址,覆蓋A值.但是, 語義上, 有一個(gè)漏洞, 當(dāng)?shù)谝淮巫x取 V 的 A 值, 此時(shí), 內(nèi)存 V 的值變?yōu)?B 值, 然 后在未執(zhí)行 CAS 前, 又變回了 A 值.此時(shí)
8、, CAS 再執(zhí)行時(shí), 會(huì)判斷其正確的, 并進(jìn)行賦值.這種判斷值的方式來斷定內(nèi)存是否被修改過, 針對(duì)某些問題, 是不適用的.為了解決這種問題,jdk 1.5并發(fā)包提供了 AtomicStampedReference(有標(biāo)記的原子引 用)類, 通過控制變量值的版本來保證 CAS 正確性.其實(shí), 大部分通過值的變化來 CAS, 已經(jīng)夠用了.jdk1.5 原子包介紹(基于 volatile)包的特色:1, 普通原子數(shù)值類型 AtomicInteger, AtomicLong 提供一些原子操作的加減運(yùn)算.2, 使用了解決臟數(shù)據(jù)問題的經(jīng)典模式-比對(duì)后設(shè)定, 即 查看主存中數(shù)據(jù)是否與預(yù)期 提供的值一致,如
9、果一致,才更新.3, 使用 AtomicReference 可以實(shí)現(xiàn)對(duì)所有對(duì)象的原子引用及賦值.包括 Double 與 Floa t,但不包括對(duì)其的計(jì)算浮點(diǎn)的計(jì)算,只能依靠同步關(guān)鍵字或Lock接口來實(shí)現(xiàn)了.4, 對(duì)數(shù)組元素里的對(duì)象,符合以上特點(diǎn)的, 也可采用原子操作.包里提供了一些數(shù)組原子操作類AtomicIntegerArray, AtomicLongArray 等等.5, 大幅度提升系統(tǒng)吞吐量及性能.本文詳細(xì)介紹JAVA100例065、線程同步* Title:線程同步* Description:通過使用同步鎖實(shí)現(xiàn)對(duì)共享數(shù)據(jù)的操作* Copy right: Copy right (c) 20
10、03* Filename: SyThreadDemo.java* version 1.0*/*類說明:主程序*功能描述:構(gòu)造兩個(gè)線程,并啟動(dòng)它們public class SyThreadDemopublic static void main (String args)addThread tt1 = new addThread (ft, add);decThread tt2 = new decThread (ft, dec);tt1.start ();tt2.start ();/*類說明:同步類*功能描述:保存共享數(shù)據(jù),classtr adeprivate String transName;pr
11、ivate double amount;/*方法說明:更新數(shù)據(jù)*輸入?yún)?shù):String transName操作名稱*輸入?yún)?shù):double amount資金數(shù)量*返回類型:synchronized void update (String transName, double amount)this.t ransName = tr ansName;this.amount = amount;System.out.println (this.transName + + this.amount);*類說明:添加資金*功能描述:?jiǎn)尉€程,調(diào)用trade.update ()方法,修改數(shù)據(jù)class addThread extends Threadprivate trade ft;addThread (trade ft, String name)super (name);public void run ()for (int i = 0; i 10; i +)ft.update (add, 2000.0);*類說明:減少資金*功能描述:?jiǎn)尉€程,調(diào)用trade.update ()方法,修改數(shù)據(jù)class decThrea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙機(jī)設(shè)備操作工道德模擬考核試卷含答案
- 富集工QC管理測(cè)試考核試卷含答案
- 中藥質(zhì)檢員操作規(guī)程知識(shí)考核試卷含答案
- 鉭電解電容器賦能、被膜工安全生產(chǎn)知識(shí)測(cè)試考核試卷含答案
- 石油勘探測(cè)量工QC管理水平考核試卷含答案
- 光學(xué)鏡頭制造工安全教育強(qiáng)化考核試卷含答案
- 樹脂采收工保密考核試卷含答案
- 干酪素點(diǎn)制工安全管理測(cè)試考核試卷含答案
- 煤層氣增產(chǎn)作業(yè)工安全培訓(xùn)效果競(jìng)賽考核試卷含答案
- 鐵氧體材料燒成工創(chuàng)新意識(shí)測(cè)試考核試卷含答案
- 新人教版小學(xué)數(shù)學(xué)教材解讀
- 勞務(wù)分紅保密協(xié)議書
- 設(shè)備、管道、鋼結(jié)構(gòu)施工方案
- 2021-2026年中國(guó)沉香木行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 2024-2030年中國(guó)海南省廢水污染物處理資金申請(qǐng)報(bào)告
- 新能源汽車技術(shù) SL03維修手冊(cè)(第4章)-電氣-4.2.2~4.2.12電器集成
- 教科版科學(xué)教材培訓(xùn)
- 甲狀腺的中醫(yī)護(hù)理
- 商住樓項(xiàng)目總體規(guī)劃方案
- 2022儲(chǔ)能系統(tǒng)在電網(wǎng)中典型應(yīng)用
- IABP主動(dòng)脈球囊反搏課件
評(píng)論
0/150
提交評(píng)論