5:Java并發(fā)編程基礎(chǔ)

1:線(xiàn)程

(1)線(xiàn)程也叫輕量級(jí)進(jìn)程舰讹。它擁有各自的計(jì)數(shù)器娃承、堆棧和局部變量等屬性,并且能夠訪(fǎng)問(wèn)共享的內(nèi)存變量桩匪。

(2)一個(gè)java程序的運(yùn)行不僅僅是main()方法的運(yùn)行打瘪,而是main線(xiàn)程和多個(gè)其他線(xiàn)程的同時(shí)運(yùn)行。

(3)如果要設(shè)置線(xiàn)程的優(yōu)先級(jí)吸祟,那么需要注意:針對(duì)頻繁阻塞(休眠或者I/O操作)的線(xiàn)程需要設(shè)置較高的優(yōu)先級(jí)瑟慈;而偏重計(jì)算(需要較多CPU時(shí)間或者偏運(yùn)算)的線(xiàn)程則設(shè)置較低的優(yōu)先級(jí),確保處理器不會(huì)被獨(dú)占屋匕。

(4)注意:線(xiàn)程優(yōu)先級(jí)不能作為程序正確性的依賴(lài)葛碧,因?yàn)椴僮飨到y(tǒng)可以完全不用理會(huì)java線(xiàn)程對(duì)于優(yōu)先級(jí)的設(shè)定。

博客:jstack工具使用过吻?http://blog.csdn.net/fenglibing/article/details/6411999

(5)java線(xiàn)程的運(yùn)行生命周期进泼,在給定的某一個(gè)時(shí)刻,線(xiàn)程只能處于一個(gè)狀態(tài)纤虽。

下面是JAVA線(xiàn)程狀態(tài)變遷圖:


說(shuō)明:

NEW狀態(tài)—一個(gè)被創(chuàng)建的線(xiàn)程乳绕,但是還沒(méi)有調(diào)用start方法。

BLOCKED狀態(tài)—一個(gè)線(xiàn)程因?yàn)榈却R界區(qū)的鎖被阻塞產(chǎn)生的狀態(tài)逼纸。(Lock或者synchronize關(guān)鍵字產(chǎn)生的狀態(tài)洋措。)

WAITING狀態(tài)—一個(gè)線(xiàn)程進(jìn)入了鎖,但是需要等待其他線(xiàn)程執(zhí)行某些操作杰刽,時(shí)間不確定菠发。(當(dāng)wait,join,park方法調(diào)用時(shí)王滤,進(jìn)入waiting狀態(tài),前提是這個(gè)線(xiàn)程已經(jīng)擁有鎖啦滓鸠。)

TIMED_WAITTING狀態(tài)—一個(gè)線(xiàn)程進(jìn)入了鎖雁乡,但是需要等待其他線(xiàn)程執(zhí)行某些操作,時(shí)間確定糜俗。(通過(guò)sleep或者wait timeout方法進(jìn)入的限期等待的狀態(tài)踱稍。)

TERMINATED狀態(tài)—退出

注意容易混淆的概念:阻塞在JUC包中LOCK接口的線(xiàn)程狀態(tài)卻是等待狀態(tài),因?yàn)镴UC包中LOCK接口對(duì)于阻塞的實(shí)現(xiàn)均使用了LockSupport類(lèi)中的相關(guān)方法悠抹。

(5)Daemon線(xiàn)程珠月,當(dāng)java虛擬機(jī)中不存在非Daemon線(xiàn)程的時(shí)候,java虛擬機(jī)將會(huì)退出锌钮。

注意1:Daemon屬性需要在啟動(dòng)線(xiàn)程之前設(shè)置桥温,不能在啟動(dòng)線(xiàn)程之后設(shè)置。

注意2:在構(gòu)建Daemon線(xiàn)程時(shí)梁丘,不能依靠finally塊中的內(nèi)容來(lái)確保執(zhí)行關(guān)閉或清理資源的邏輯侵浸。

2:?jiǎn)?dòng)和終止線(xiàn)程

(1)線(xiàn)程的構(gòu)建記住一句話(huà):一個(gè)新構(gòu)造的線(xiàn)程對(duì)象是由其parent線(xiàn)程來(lái)進(jìn)行空間分配的,而child線(xiàn)程繼承了parent是否為Daemon氛谜、優(yōu)先級(jí)和加載資源的contextClassLoader以及可繼承的ThreadLocal掏觉,同時(shí)還會(huì)分配一個(gè)唯一的ID來(lái)標(biāo)識(shí)這個(gè)child線(xiàn)程。至此值漫,一個(gè)能夠運(yùn)行的線(xiàn)程對(duì)象就初始化好啦澳腹,在堆內(nèi)存中等待著運(yùn)行。

(2)中斷杨何?簡(jiǎn)單的說(shuō):中斷好比其他線(xiàn)程對(duì)該線(xiàn)程打了招呼酱塔,其他線(xiàn)程通過(guò)調(diào)用該線(xiàn)程的interrupt()方法對(duì)其進(jìn)行中斷操作。

(3)廢棄的API:suspend()暫停危虱、resume()恢復(fù)羊娃、stop()停止,為啥廢棄呢埃跷?因?yàn)槌钟墟i蕊玷,不釋放,可能導(dǎo)致死鎖弥雹。致命的的是也不支持中斷垃帅。

(4)如何安全的終止線(xiàn)程呢?一種方法:使用中斷來(lái)取消或停止任務(wù)剪勿。另一種方法:利用一個(gè)boolean變量來(lái)控制是否需要停止任務(wù)并終止該線(xiàn)程贸诚。

3:線(xiàn)程間通信

(1)一個(gè)線(xiàn)程一旦開(kāi)始運(yùn)行哭靖,就擁有自己的椩吲荩空間勤庐。

(2)volatile可以用來(lái)修飾字段(成員變量)曙搬,就是告知程序任何對(duì)該變量的訪(fǎng)問(wèn)均需要從共享內(nèi)存中獲取,而對(duì)它的改變必須同步刷新回共享內(nèi)存媒怯,它能保證所有線(xiàn)程對(duì)變量訪(fǎng)問(wèn)的可見(jiàn)性。

(3)sychronized實(shí)現(xiàn)原理:對(duì)一個(gè)對(duì)象的監(jiān)視器(monitor)進(jìn)行獲取髓窜,而這個(gè)獲取過(guò)程是排他的扇苞。也就是同一時(shí)刻只能有一個(gè)線(xiàn)程獲取到由synchronized所保護(hù)對(duì)象的監(jiān)視器。

對(duì)象寄纵、對(duì)象監(jiān)視器鳖敷、同步隊(duì)列和執(zhí)行線(xiàn)程之間的關(guān)系


任意線(xiàn)程對(duì)Object(Object由synchronized保護(hù))的訪(fǎng)問(wèn),首先要獲得Object的監(jiān)視器程拭。如果獲取失敗定踱,線(xiàn)程進(jìn)入同步隊(duì)列,線(xiàn)程狀態(tài)變?yōu)锽LOCKED恃鞋。當(dāng)訪(fǎng)問(wèn)Object的前驅(qū)(獲得了鎖的線(xiàn)程)釋放了鎖崖媚,則該釋放操作喚醒阻塞在同步隊(duì)列中的線(xiàn)程,使其嘗試對(duì)監(jiān)視器的獲取恤浪。

(3)等待/通知機(jī)制是任意java對(duì)象都具備的畅哑,因?yàn)槎x在Object里面。下面是等待/通知相關(guān)方法:


使用wait()水由、notify()荠呐、notifyAll()時(shí)需要注意的細(xì)節(jié):

1)使用wait()、notify()砂客、notifyAll()時(shí)需要先調(diào)用對(duì)象加鎖泥张。

2)調(diào)用wait()方法后,線(xiàn)程狀態(tài)由RUNNING變?yōu)閃AITING鞠值,并將當(dāng)前線(xiàn)程放置到等待隊(duì)列中媚创。

3)notify()或notifyAll()方法調(diào)用后,等待線(xiàn)程依舊不會(huì)從wait()返回齿诉,需要調(diào)用notify()或notifyAll()的線(xiàn)程釋放鎖之后筝野,等待線(xiàn)程才有機(jī)會(huì)從wait()返回。

4)notify()方法將等待隊(duì)列中的一個(gè)等待線(xiàn)程從等待隊(duì)列中移到同步隊(duì)列中粤剧,而notifyAll()方法則是將等待隊(duì)列中所有的線(xiàn)程全部移到同步隊(duì)列歇竟,被移動(dòng)的線(xiàn)程狀態(tài)由WAITING變?yōu)锽LOCKED。

5)從wait()方法返回的前期是或得了調(diào)用對(duì)象的鎖抵恋。

(4)等待/通知的經(jīng)典范式焕议,分別針對(duì)等待方(消費(fèi)者)和通知方(生產(chǎn)者)

等待方遵循如下原則:

a:獲取對(duì)象的鎖

b:如果條件不滿(mǎn)足,那么調(diào)用對(duì)象的wait()方法弧关,被通知后仍要檢查條件盅安。

c:條件滿(mǎn)足則執(zhí)行對(duì)應(yīng)邏輯唤锉。

通知方遵循如下原則:

a:獲得對(duì)象的鎖。

b:改變條件

c:通知所有等待在對(duì)象上的線(xiàn)程别瞭。

(5)管道輸入/輸出流和普通文件的輸入/輸出流或者網(wǎng)絡(luò)輸入/輸出流不同處:它主要用于線(xiàn)程之間的數(shù)據(jù)傳輸窿祥,而傳輸?shù)拿浇闉閮?nèi)存。

PipedOutputStream蝙寨、PipedInputStream面向字節(jié)

PipedWriter晒衩、PipedReader面向字符

(6)Thread.join():如果一個(gè)線(xiàn)程A執(zhí)行了thread.join()語(yǔ)句,表示:當(dāng)前線(xiàn)程A等待thread線(xiàn)程終止后才從thread.join()返回墙歪。這里涉及了等待/通知機(jī)制(等待前驅(qū)線(xiàn)程結(jié)束听系,接收前驅(qū)線(xiàn)程結(jié)束通知)

(7)ThreadLocal(線(xiàn)程變量)的使用。它是一個(gè)以ThreadLocal對(duì)象為鍵虹菲、任意對(duì)象為值的存儲(chǔ)結(jié)構(gòu)靠胜。這個(gè)結(jié)構(gòu)會(huì)被附帶在線(xiàn)程上,也就是說(shuō)一個(gè)線(xiàn)程可以根據(jù)一個(gè)ThreadLocal對(duì)象查詢(xún)到綁定在這個(gè)線(xiàn)程上的一個(gè)值毕源。

4:線(xiàn)程應(yīng)用實(shí)例

(1)等待超時(shí)模式?(使用等待超時(shí)模式來(lái)構(gòu)造一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池浪漠。)

(2)線(xiàn)程池技術(shù)?(使用線(xiàn)程池技術(shù)構(gòu)建一個(gè)簡(jiǎn)單的web服務(wù)器脑豹。)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郑藏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瘩欺,更是在濱河造成了極大的恐慌必盖,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俱饿,死亡現(xiàn)場(chǎng)離奇詭異歌粥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拍埠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)失驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枣购,你說(shuō)我怎么就攤上這事嬉探。” “怎么了棉圈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵涩堤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我分瘾,道長(zhǎng)胎围,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮白魂,結(jié)果婚禮上汽纤,老公的妹妹穿的比我還像新娘。我一直安慰自己福荸,他們只是感情好蕴坪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著敬锐,像睡著了一般辞嗡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滞造,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音栋烤,去河邊找鬼谒养。 笑死,一個(gè)胖子當(dāng)著我的面吹牛明郭,可吹牛的內(nèi)容都是我干的买窟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼薯定,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼始绍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起话侄,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亏推,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后年堆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吞杭,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年变丧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芽狗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痒蓬,死狀恐怖童擎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攻晒,我是刑警寧澤顾复,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站炎辨,受9級(jí)特大地震影響捕透,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一乙嘀、第九天 我趴在偏房一處隱蔽的房頂上張望末购。 院中可真熱鬧,春花似錦虎谢、人聲如沸盟榴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)擎场。三九已至,卻和暖如春几莽,著一層夾襖步出監(jiān)牢的瞬間迅办,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工章蚣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留站欺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓纤垂,卻偏偏與公主長(zhǎng)得像矾策,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峭沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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