重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
這篇文章主要介紹“java并發(fā)編程的基礎(chǔ)”,在日常操作中,相信很多人在java并發(fā)編程的基礎(chǔ)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java并發(fā)編程的基礎(chǔ)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國際域名空間、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、漳浦網(wǎng)站維護(hù)、網(wǎng)站推廣。
原因是,CPU的頻率太快了,快到主存跟不上,這樣在處理器時(shí)鐘周期內(nèi),CPU常常需要等待主存,浪費(fèi)資源。所以cache的出現(xiàn),是為了緩解CPU和內(nèi)存之間速度的不匹配問題。
時(shí)間局部性:如果某個(gè)數(shù)據(jù)被訪問,那么在不久的將來它很有可能被再次訪問。
空間局部性:如果某個(gè)數(shù)據(jù)被訪問,那么與它相鄰的數(shù)據(jù)很快也可能被訪問。
用于保證多個(gè)CPU cache之間緩存共享數(shù)據(jù)的一致
處理器為了提高執(zhí)行速度而做出的違背代碼原有順序的優(yōu)化。在單核情況下沒有問題,但是在多核環(huán)境下會出現(xiàn)問題。
這是一種規(guī)范,規(guī)范了Java虛擬機(jī)與計(jì)算機(jī)內(nèi)存是如何協(xié)同工作的,規(guī)定了一個(gè)線程如何以及何時(shí)可以看到其他線程修改共享變量的值并且如何同步訪問共享變量。
如上圖所示,java內(nèi)存模型要求,調(diào)用棧和本地變量存放在線程棧上,如圖中Thread Stack,對象存放在堆中(Heap)。本地變量Local variable2是一個(gè)指向?qū)ο蟮囊?,Local variable存放在線程棧上,但對象存放在堆上。存放在堆上的對象可以被所持有對這個(gè)對象引用的線程訪問,并且可以訪問這個(gè)對象的成員變量,而當(dāng)兩個(gè)線程同時(shí)訪問object3上的同一個(gè)方法時(shí),都會訪問方法中的成員變量,那么每一個(gè)線程會擁有這個(gè)對象成員變量的私有拷貝。
線程之間的通信必須經(jīng)過主內(nèi)存,例如線程A想要與線程B進(jìn)行通信,線程A需要將共享變量的副本刷新到主內(nèi)存中,然后線程B讀取主內(nèi)存的線程A更新過的共享變量。因此會出現(xiàn)同步問題。
lock(鎖定):作用于主內(nèi)存的變量,把一個(gè)變量標(biāo)識為一條線程獨(dú)占狀態(tài)。
unlock(解鎖):作用于主內(nèi)存的變量,把一個(gè)處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定。
read(讀?。鹤饔糜谥鲀?nèi)存的變量,把一個(gè)變量值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的load動(dòng)作使用
load(載入):作用于工作內(nèi)存的變量,它把read操作從主內(nèi)存中得到的變量放入工作內(nèi)存的變量副本中。
use(使用):作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個(gè)變量值傳遞給執(zhí)行引擎。
assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量。
store(存儲):作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write操作。
write(寫入):作用于主內(nèi)存的變量,它把store操作從工作內(nèi)存中一個(gè)變量的值傳送到主內(nèi)存的變量中。
如果要把一個(gè)變量從主內(nèi)存中復(fù)制到工作內(nèi)存,就需要按順序的執(zhí)行read和load操作;如果把變量從工作內(nèi)存中同步回主內(nèi)存中,就要按順序地執(zhí)行store和write操作。但java內(nèi)存模型只要求上述操作必須按順序執(zhí)行,而沒有保證必須是連續(xù)執(zhí)行。
不允許read和load、store和write操作之一單獨(dú)出現(xiàn)。
不允許一個(gè)線程丟棄它的最近assign的操作,即變量在工作內(nèi)存中改變了之后必須同步到主內(nèi)存中。
不允許一個(gè)線程無原因的(沒有發(fā)生過任何assign操作)把數(shù)據(jù)從工作內(nèi)存同步回主內(nèi)存中。
一個(gè)新的變量只能在主內(nèi)存中誕生,不允許在工作內(nèi)存中直接使用一個(gè)未被初始化(load或assign)的變量。即就是對一個(gè)變量實(shí)施use和store操作之前,必須先執(zhí)行過assign和load操作。
一個(gè)變量在同一時(shí)刻只允許一條線程對其進(jìn)行l(wèi)ock操作,但lock操作可以被同一條線程重復(fù)執(zhí)行多次,多次執(zhí)行l(wèi)ock后,只有執(zhí)行相同次數(shù)的unlock操作,變量才會被解鎖。lock和unlock必須成對出現(xiàn)。
如果對一個(gè)變量執(zhí)行l(wèi)ock操作,將會清空工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個(gè)變量前需要重新執(zhí)行l(wèi)oad或assign操作初始化變量的值。
如果一個(gè)變量事先沒有被lock操作鎖定,則不允許對它執(zhí)行unlock操作;也不允許去unlock一個(gè)被其他線程鎖定的變量。
對一個(gè)變量執(zhí)行unlock操作之前,必須先把此變量同步到主內(nèi)存中(執(zhí)行store和write操作)
優(yōu)勢:
速度:同時(shí)處理多個(gè)請求,響應(yīng)更快;復(fù)雜的操作可以分成多個(gè)進(jìn)程同時(shí)進(jìn)行。
設(shè)計(jì):程序設(shè)計(jì)在某些情況下更簡單,也可以有更多的選擇。
資源利用:CPU能夠在等待IO的時(shí)候做一些其他的事情。
風(fēng)險(xiǎn):
安全性:多個(gè)線程共享數(shù)據(jù)時(shí)可能會產(chǎn)生與期望不相符的結(jié)果
活躍性:某個(gè)操作無法繼續(xù)進(jìn)行下去時(shí),就會發(fā)生活躍性問題。比如死鎖、饑餓等問題。
性能:線程過多會使得CPU頻繁切換,調(diào)度時(shí)間增多,同步機(jī)制,消耗過多內(nèi)存。
到此,關(guān)于“java并發(fā)編程的基礎(chǔ)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!