1.多線程基本概念

基本知識(shí)

在多核的CPU中,一個(gè)CPU(核心),一個(gè)核心基本可以運(yùn)行多個(gè)線程湿右,每個(gè)執(zhí)行一段時(shí)間切換到下一個(gè)線程,但是如果線程過(guò)多就會(huì)產(chǎn)生 切換上下文的時(shí)間消耗罚勾,所以線程不能過(guò)多毅人。由于現(xiàn)在CPU執(zhí)行速度過(guò)快,內(nèi)存極大的拖慢了速度漾唉,所以在CPU中會(huì)有L1、L2堰塌、L3的緩存赵刑,速度極快,用于充當(dāng)CPU和內(nèi)存的橋梁提高速度

CPU多級(jí)緩存

由于每個(gè)CPU都有自己的緩存區(qū)场刑,為了保證多個(gè)CPU緩存區(qū)域使用到共享數(shù)據(jù)如何保證數(shù)據(jù)的一致性般此,就出現(xiàn)了MESI的協(xié)議
M(修改):當(dāng)前CPU緩存獨(dú)占且已修改了共享數(shù)據(jù),即與主存的數(shù)據(jù)不一致,需要被寫(xiě)回主內(nèi)存牵现,當(dāng)寫(xiě)回主存以后變?yōu)镋狀態(tài)
E(獨(dú)享):一個(gè)CPU緩存獨(dú)占數(shù)據(jù)且和主存中的一致铐懊,當(dāng)被讀取時(shí)進(jìn)入S狀態(tài),當(dāng)被修改時(shí)進(jìn)入M狀態(tài)
S(共享): 該緩存與主存中的數(shù)據(jù)一致瞎疼,可能被多個(gè)CPU緩存科乎,當(dāng)其中cpu對(duì)數(shù)據(jù)做出修改時(shí),其他cpu緩存的該數(shù)據(jù)可以進(jìn)入I(無(wú)效)狀態(tài)
I(無(wú)效):緩存無(wú)效贼急,其他cpu修改了共享數(shù)據(jù)
除了I狀態(tài)茅茂,其他狀態(tài)都可以被讀取,寫(xiě)請(qǐng)求只能在M狀態(tài)或者是E狀態(tài)下可以被寫(xiě)入太抓,如果處于S必須將其他cpu中的數(shù)據(jù)變?yōu)镮狀態(tài)才可寫(xiě)入

image.png

CPU優(yōu)化

CPU可能會(huì)為了提高運(yùn)算速度而調(diào)整代碼原有順序空闲,但是會(huì)保證結(jié)果一致,但是多核環(huán)境下不一定走敌,因?yàn)槎嗪诉\(yùn)行可能第一個(gè)依賴第二個(gè)核的線程的結(jié)果在做操作碴倾,但是結(jié)果CPU優(yōu)化把第一個(gè)CPU的代碼先運(yùn)行就會(huì)造成某些意料之外的結(jié)果

使用多處理器

如果使用一個(gè)雙處理器中運(yùn)行一個(gè)單線程程序,等于放棄了其中一半的資源,其實(shí)單個(gè)處理器也能運(yùn)行多線程程序,如果一個(gè)線程是單線程的,在這個(gè)處理器等待同步IO時(shí),處理器依舊是空閑狀態(tài),如果使用程序多線程,當(dāng)程序遇到阻塞時(shí),另外一個(gè)線程也能執(zhí)行

使用多線程的好處

多線程毋庸置疑的,在把多個(gè)任務(wù)分給多個(gè)線程,能提高其效率,但是如果創(chuàng)建過(guò)多的線程可能反而會(huì)降低效率, 因?yàn)檫^(guò)多的線程會(huì)引起上下文切換,因?yàn)樘幚砥髟趫?zhí)行的時(shí)候是分時(shí)執(zhí)行,需要在不同的線程中來(lái)回切換,這就導(dǎo)致了大量時(shí)間消耗

線程安全舉例

在我們常用的servlet中,在客戶端發(fā)送請(qǐng)求過(guò)來(lái)時(shí),都是多線程訪問(wèn)servlet,但是我們好像重來(lái)沒(méi)有關(guān)注過(guò)它,那么它們是線程安全的嗎,如下,她是線程安全的,因?yàn)樗且粋€(gè)無(wú)狀態(tài)類,每一個(gè)線程進(jìn)入以后,都會(huì)新建那些變量,對(duì)象之間沒(méi)有共享狀態(tài),故而是安全的

image.png

下面這個(gè)servlet是線程不安全的,因?yàn)樗鼈冊(cè)L問(wèn)了類變量,類變量是對(duì)象之間共享的,也就是線程之間共享的,多個(gè)線程操作同一個(gè)共享變量就會(huì)造成線程安全問(wèn)題,因?yàn)?code>i++并不是一個(gè)原子性操作,它的操作可以被分解為三個(gè)步驟,取出i,i+1,賦值給i,多個(gè)線程運(yùn)行時(shí),可能阻塞在其中一步,就運(yùn)行其他線程,導(dǎo)致的結(jié)果就是多個(gè)線程修改后的變量結(jié)果一致
image.png

競(jìng)爭(zhēng)條件和數(shù)據(jù)競(jìng)爭(zhēng)

競(jìng)爭(zhēng)條件:指的是當(dāng)一個(gè)線程在執(zhí)行一個(gè)判斷語(yǔ)句為真,然后阻塞去執(zhí)行線程2,線程2把判斷語(yǔ)句里的指值更新到了false,這是線程1就會(huì)出現(xiàn)預(yù)料之外的問(wèn)題,例如懶漢式單例就存在競(jìng)爭(zhēng)條件
數(shù)據(jù)競(jìng)爭(zhēng):上面那個(gè)線程非安全的舉例就是數(shù)據(jù)競(jìng)爭(zhēng),由于沒(méi)有對(duì)共享變量做同步處理,多個(gè)線程訪問(wèn)時(shí),可能在去讀到還未修改時(shí),另外一個(gè)線程也在讀取修改

原子性

有線程A和B,當(dāng)線程B在執(zhí)行多個(gè)操作時(shí),必須保證這個(gè)B的操作要么同時(shí)操作,要么不操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掉丽,隨后出現(xiàn)的幾起案子跌榔,更是在濱河造成了極大的恐慌,老刑警劉巖捶障,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僧须,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡残邀,警方通過(guò)查閱死者的電腦和手機(jī)皆辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)柑蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芥挣,“玉大人,你說(shuō)我怎么就攤上這事耻台】彰猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盆耽,是天一觀的道長(zhǎng)蹋砚。 經(jīng)常有香客問(wèn)我扼菠,道長(zhǎng),這世上最難降的妖魔是什么坝咐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任循榆,我火速辦了婚禮,結(jié)果婚禮上墨坚,老公的妹妹穿的比我還像新娘秧饮。我一直安慰自己,他們只是感情好泽篮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盗尸。 她就那樣靜靜地躺著,像睡著了一般帽撑。 火紅的嫁衣襯著肌膚如雪泼各。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天亏拉,我揣著相機(jī)與錄音扣蜻,去河邊找鬼。 笑死及塘,一個(gè)胖子當(dāng)著我的面吹牛弱贼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磷蛹,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吮旅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了味咳?” 一聲冷哼從身側(cè)響起庇勃,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎槽驶,沒(méi)想到半個(gè)月后责嚷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掂铐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年罕拂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全陨。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爆班,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辱姨,到底是詐尸還是另有隱情柿菩,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布雨涛,位于F島的核電站枢舶,受9級(jí)特大地震影響懦胞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凉泄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一躏尉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧后众,春花似錦醇份、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拗盒,卻和暖如春怖竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陡蝇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工痊臭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人登夫。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓广匙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恼策。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸦致,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,103評(píng)論 1 32
  • 1分唾、什么是多線程 多線程(英語(yǔ):multithreading),是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)狮斗。具...
    Laughingg閱讀 674評(píng)論 0 4
  • 線程池ThreadPoolExecutor corepoolsize:核心池的大小绽乔,默認(rèn)情況下,在創(chuàng)建了線程池之后...
    irckwk1閱讀 728評(píng)論 0 0
  • 什么是多線程碳褒? 一個(gè)程序(一個(gè)進(jìn)程)運(yùn)行過(guò)程中產(chǎn)生了不止一個(gè)線程折砸。 一個(gè)生產(chǎn)汽車的車間好比一個(gè)進(jìn)程,這個(gè)車間里的每...
    powerjiajun閱讀 264評(píng)論 0 0
  • ??一個(gè)任務(wù)通常就是一個(gè)程序沙峻,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程睦授。當(dāng)一個(gè)程序運(yùn)行時(shí),內(nèi)部可能包含了多個(gè)順序執(zhí)行流专酗,每個(gè)順...
    OmaiMoon閱讀 1,677評(píng)論 0 12