Java線程模型

Java線程模型

本文將從線程類型笔喉、線程通信洲鸠、線程調(diào)度三個(gè)方面分析Java中的線程模型。

什么是線程教馆?

線程就是進(jìn)程的切片。因?yàn)镃PU速度太快擂达,進(jìn)程切換時(shí)cpu都要進(jìn)行進(jìn)程上下文的加載土铺、保存操作。對(duì)CPU來說是巨大的性能浪費(fèi)板鬓。所以引入線程的目的就是為了細(xì)化進(jìn)程對(duì)CPU時(shí)間占用粒度悲敷,更加充分的利用CPU。

因?yàn)榫€程是對(duì)進(jìn)程的切片俭令,所以線程是共享進(jìn)程資源的后德,同一進(jìn)程里線程的切換不會(huì)影響進(jìn)程的切換。

與進(jìn)程的區(qū)別

  1. 進(jìn)程是資源分配的最小單位,線程是調(diào)度的最小單位抄腔。
  2. 進(jìn)程獨(dú)占資源瓢湃,線程共享進(jìn)程資源。

線程的類型

內(nèi)核線程(KLT)

內(nèi)核線程就是直接由操作系統(tǒng)內(nèi)核支持的線程赫蛇,這種線程由內(nèi)核來完成線程切換绵患,內(nèi)核通過操縱調(diào)度器對(duì)線程進(jìn)行調(diào)度,并負(fù)責(zé)將線程的任務(wù)映射到各個(gè)處理器上悟耘。每個(gè)內(nèi)核線程可以視為內(nèi)核的一個(gè)分身落蝙,這樣操作系統(tǒng)就有能力同時(shí)處理多件事情,支持多線程的內(nèi)核就叫做多線程內(nèi)核暂幼。

輕量級(jí)進(jìn)程(LWP)

輕量級(jí)進(jìn)程是由系統(tǒng)提供給用戶的操作內(nèi)核線程的接口的實(shí)現(xiàn)筏勒。即輕量級(jí)進(jìn)程是內(nèi)核線程的一個(gè)替身。

用戶線程(UT)

用戶線程建立在用戶空間的線程庫(kù)上旺嬉,系統(tǒng)內(nèi)核不能感知線程存在的實(shí)現(xiàn)管行。用戶線程的建立、同步邪媳、銷毀和調(diào)度完全在用戶態(tài)中完成病瞳,不需要內(nèi)核的幫助揽咕。如果程序?qū)崿F(xiàn)得當(dāng),這種線程不需要切換到內(nèi)核態(tài)套菜,因此操作可以是非城咨疲快速且低消耗的,也可以支持規(guī)模更大的線程數(shù)量逗柴,部分高性能數(shù)據(jù)庫(kù)中的多線程就是由用戶線程實(shí)現(xiàn)的蛹头。

線程模型

一對(duì)一模型

一對(duì)一模型即輕量級(jí)進(jìn)程的實(shí)現(xiàn)模式。一個(gè)LWP對(duì)應(yīng)一個(gè)KLT戏溺。
優(yōu)點(diǎn):每個(gè)LWP都是獨(dú)立的調(diào)度單元渣蜗,一個(gè)線程阻塞不影響其他線程。
缺點(diǎn):因?yàn)榕cKLT一對(duì)一旷祸。而KLT創(chuàng)建耕拷,調(diào)度需要一定內(nèi)核資源,因此創(chuàng)建數(shù)量有限托享。

一對(duì)多模型

一對(duì)多模型及用戶線程實(shí)現(xiàn)方式骚烧。一個(gè)進(jìn)程對(duì)應(yīng)多個(gè)UT。

優(yōu)點(diǎn):線程的管理在用戶空間進(jìn)行闰围。比較高效赃绊。

缺點(diǎn):需要用戶自己考慮線程的調(diào)度相關(guān)問題,因?yàn)橄到y(tǒng)對(duì)UT無感知羡榴,所以一個(gè)線程阻塞會(huì)導(dǎo)致進(jìn)程阻塞碧查。

多對(duì)多模型

在一對(duì)多的基礎(chǔ)上引入KLT。即一個(gè)進(jìn)程管理多個(gè)KLT校仑,KLT對(duì)應(yīng)多個(gè)UT忠售。
將 n 個(gè)UT映射到m個(gè)KLT上,要求 m <= n迄沫。

優(yōu)點(diǎn): 集合了前兩種模型的優(yōu)點(diǎn)档痪,去掉了他們的缺點(diǎn)。
缺點(diǎn):全是優(yōu)點(diǎn)邢滑。

線程的調(diào)度方式

搶占式調(diào)度

每個(gè)線程由系統(tǒng)分配CPU時(shí)間腐螟,線程本身無法控制使用多次CPU時(shí)間。好處是線程的執(zhí)行時(shí)間是可控的困后,不會(huì)造成因?yàn)橐粋€(gè)線程導(dǎo)致進(jìn)程長(zhǎng)時(shí)間阻塞問題乐纸。

協(xié)同式調(diào)度

線程自己控制CPU時(shí)間。并且當(dāng)前線程執(zhí)行完畢后需要通知系統(tǒng)切換另外一個(gè)線程摇予。最主要的問題是線程的切換取決于線程本身汽绢,若線程存在Bug導(dǎo)致切換線程不成功則會(huì)一直阻塞。

線程間通信與同步

線程雖然可以獨(dú)立的執(zhí)行侧戴。但是總會(huì)有需要不同的線程互相配合的情況宁昭,這就涉及到線程的通信與同步跌宛。目前有兩種方式。

共享內(nèi)存

共享內(nèi)存的并發(fā)模型里線程通過顯示的同步即通過互斥實(shí)現(xiàn)對(duì)公共空間的讀寫积仗,將需要共享的數(shù)據(jù)同步到公共的內(nèi)存中疆拘,這樣便實(shí)現(xiàn)了間接的通信。即共享內(nèi)存是顯示同步寂曹,隱式通信哎迄。

消息傳遞

消息傳遞模型即消息傳遞,線程間無公共內(nèi)存隆圆,因?yàn)橄⑼ㄐ盘烊痪哂邢群箨P(guān)系所以間接實(shí)現(xiàn)類數(shù)據(jù)的同步漱挚。所以消息傳遞模型是顯示通信,隱式同步渺氧。

Java中的線程

線程模型

目前Java默認(rèn)使用的是一對(duì)一模型旨涝。即LWP方案。不過在支持多對(duì)多的平臺(tái)上可以通過JVM參數(shù)控制使用多對(duì)多模型侣背。

相關(guān)參數(shù)

-XX:+UseLWPSynchronization(默認(rèn)值)
-XX:+UseBoundThreads

調(diào)度方式

Java采用搶占式調(diào)度白华。同時(shí)Java定義了10中線程優(yōu)先級(jí)⊥翰龋可以在一定程度上調(diào)整線程的CPU時(shí)間。

通信機(jī)制

Java采用的是共享內(nèi)存并發(fā)模型业筏。具體可參考Java內(nèi)存模型憔杨。

參考

  1. <<深入理解Java虛擬機(jī): JVM高級(jí)特性與最佳實(shí)踐>>
  2. <<Java并發(fā)編程的藝術(shù)>>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蒜胖,隨后出現(xiàn)的幾起案子消别,更是在濱河造成了極大的恐慌,老刑警劉巖台谢,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寻狂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朋沮,警方通過查閱死者的電腦和手機(jī)蛇券,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樊拓,“玉大人纠亚,你說我怎么就攤上這事〗钕模” “怎么了蒂胞?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)条篷。 經(jīng)常有香客問我骗随,道長(zhǎng)蛤织,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任鸿染,我火速辦了婚禮指蚜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牡昆。我一直安慰自己姚炕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布丢烘。 她就那樣靜靜地躺著柱宦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪播瞳。 梳的紋絲不亂的頭發(fā)上掸刊,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音赢乓,去河邊找鬼忧侧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牌芋,可吹牛的內(nèi)容都是我干的蚓炬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼躺屁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肯夏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起犀暑,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤驯击,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耐亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徊都,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年广辰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暇矫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡择吊,死狀恐怖袱耽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情干发,我是刑警寧澤朱巨,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站枉长,受9級(jí)特大地震影響冀续,放射性物質(zhì)發(fā)生泄漏琼讽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一洪唐、第九天 我趴在偏房一處隱蔽的房頂上張望钻蹬。 院中可真熱鬧,春花似錦凭需、人聲如沸问欠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)顺献。三九已至,卻和暖如春枯怖,著一層夾襖步出監(jiān)牢的瞬間注整,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工度硝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肿轨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓蕊程,卻偏偏與公主長(zhǎng)得像椒袍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藻茂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 要真正了解Java的多線程驹暑,我們還要從進(jìn)程和線程的概念說起 進(jìn)程 進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)...
    似水牛年閱讀 5,499評(píng)論 1 11
  • 除了充分利用計(jì)算機(jī)處理器的能力外,一個(gè)服務(wù)端同時(shí)對(duì)多個(gè)客戶端提供服務(wù)則是另一個(gè)更具體的并發(fā)應(yīng)用場(chǎng)景捌治。衡量一個(gè)服務(wù)性...
    胡二囧閱讀 1,322評(píng)論 0 12
  • 1.概述 讓計(jì)算機(jī)同時(shí)做幾件事岗钩,一個(gè)很重要的原因是計(jì)算機(jī)的運(yùn)算速度與它的存儲(chǔ)和通信子系統(tǒng)速度差距太大纽窟,大量的時(shí)間花...
    過來摸摸頭丶閱讀 427評(píng)論 0 1
  • 作者:楊興強(qiáng)原文來源:開點(diǎn)工作室(ID:kaidiancs) 一.從一個(gè)例子開始 看著Java線程執(zhí)行起來的那種任...
    開點(diǎn)工作室閱讀 6,761評(píng)論 2 28
  • 低沉的水坑佝僂著背 點(diǎn)綴在遲遲的微光里 雨傘撐小了 毛衣變大了 風(fēng)也簇溜地吹起來了 如果天空在那時(shí) 多了一片孤寂的...
    玉米卷的夏天閱讀 248評(píng)論 0 0