第七章 線程

進程:正在進行的應用程序(靜態(tài))

線程:一個進程中的控制單元,一條執(zhí)行路徑,程序?qū)嶋H執(zhí)行的是線程。

一個CPU只支持一個線程執(zhí)行趟脂,因此單CPU采用隨機性原理(CPU快速切換,哪個線程獲取CPU執(zhí)行權例衍,哪個線程執(zhí)行)


main()就是一個線程昔期,成為主線程,主線程優(yōu)先佛玄,cpu先把時間片給主線程

注:一個進程中所有線程都在該進程的虛擬空間中硼一,使用進程的全局變量和系統(tǒng)資源

什么時候考慮使用多線程?當需要某兩個方法同時進行的時候


創(chuàng)建線程兩種方式

一梦抢、繼承Thread般贼,重寫run()方法

(1)創(chuàng)建線程類對象,調(diào)用start()方法(對象與對象間資源不共享)

二惑申、實現(xiàn)Runnable接口具伍。好處:避免了單繼承的局限

(1)定義類實現(xiàn)Runnable接口

? ? class? Test implements Runable

? (2)重寫接口中run()方法,運行start執(zhí)行的就是run()方法里的內(nèi)容

? (3)創(chuàng)建實現(xiàn)接口類的對象(將需執(zhí)行的任務實例化)

? Test t=new Test()

? (4)通過Thread生成一個線程圈驼,傳入需執(zhí)行任務,調(diào)用start()方法

? Thread t1=new Thread(t)//? Thread t1=new Thread(t望几,"線程名")


Start方法與run方法之間的調(diào)用關系

調(diào)用start()會先創(chuàng)建一個新的線程绩脆,這個線程進行一些初始化工作,然后再由這個線程調(diào)用run()


常用方法

為什么sleep方法只能try catch異常橄抹,不能throw靴迫?

因為Runnable接口使用的是try? catch? 實現(xiàn)接口的類就不能使用throw了


線程的優(yōu)先級

? ? ? ? 線程的優(yōu)先級分為10種從1 – 10數(shù)越小優(yōu)先級越低數(shù)越大優(yōu)先級越大,優(yōu)先級高低影響時間片的分配楼誓,優(yōu)先級越高分配時間片的概率越大玉锌,反之越小。高優(yōu)先級只能說明這個程序優(yōu)先執(zhí)行


線程禮讓(禮讓)

(static void)Yield();滿足某一個條件的時候讓出當前時間片讓其它線程執(zhí)行(只讓出一次)

線程的加入

(void)Join:先執(zhí)行加入的線程

有線程t1 t2想讓t1執(zhí)行完畢之后再執(zhí)行t2要把t1加入到t2當中疟羹,才能保證t1執(zhí)行完畢之后t2才執(zhí)行


守護線程

setDaemon(boolean on)

在程序當中其它的線程都執(zhí)行完畢之后主守,守護線程不管是否已經(jīng)執(zhí)行完畢都強制結(jié)束

Gc就是一個守護線程:垃圾回收器


線程的生命周期


多線程安全問題(使用線程同步解決)? 沒有安全問題使用線程異步禀倔,效率高

當run()方法體內(nèi)的代碼操作到了成員變量(共享數(shù)據(jù))時,就可能會出現(xiàn)多線程安全問題(線程不同步問題)


多線程安全問題出現(xiàn)的原因

例:總共有100張票参淫,兩個窗口賣票救湖,一窗口賣出第20張票時,正要把票的數(shù)據(jù)打印出來涎才,這時二窗口賣出了第21張票鞋既,這就會導致最后打印出的票是第21張票。(每個窗口就是一個線程)

解決辦法耍铜,少使用成員變量多用局部變量

? ? ? ? 為了解決多線程訪問同一資源而出現(xiàn)的安全問題邑闺,我們可以選擇給會出現(xiàn)安全問題的地方加上互斥鎖synchronized,當某個代碼塊被鎖住棕兼,表明該對象在同一時刻只能由一個線程訪問

1.synchronized(this)? ? //this表示的是當前對象

{? ? ? 被同步的代碼检吆;? }

2. synchronized void? 方法名{? }? ? //默認鎖的是當前對象,不推薦使用 因為方法中可能有一些部分并不需要同步程储,同步的代碼越多效率越低

當鎖住一段代碼的時候蹭沛,鎖的鑰匙只有當前執(zhí)行的代碼有,被鎖住的這一段代碼執(zhí)行完后章鲤,才會把鑰匙給別人


賣票的解決方法:

鎖的問題摊灭,如何確定究竟應該所在什么位置?


啟動的兩個線程操縱的都是銀行類里的Money屬性,所以當?shù)谝粋€線程執(zhí)行完之后败徊,第二個線程操縱的是money+完后的錢帚呼,

而這個時候如果沒有鎖的話,當一個線程執(zhí)行完money+之后皱蹦,另一個線程操縱的是money+后的錢煤杀,當2線程也執(zhí)行money+操作后第一個線程輸出,就會輸出錯誤數(shù)據(jù)沪哺。這個for循環(huán)控制的是每個線程只能執(zhí)行6次沈自,所以鎖加到循環(huán)里,是每循環(huán)一次辜妓,兩個線程都可以操作一次枯途,而如果加到循環(huán)外,就變成了一個線程循環(huán)完六次籍滴,另一個線程再進行



面試題

線程1執(zhí)行時酪夷,另一個線程可以同時執(zhí)行方法m2么?孽惰,當然可以晚岭,鎖只是針對鎖住的代碼

當有讀和寫兩個線程,寫線程應該被同步


死鎖問題


解決辦法:加大鎖的粒度



線程安全對單例模式的影響

對于靜態(tài)方法的的鎖對象是什么勋功?

當前類的字節(jié)碼對應的class類--------類.class;


對于餓漢沒有影響坦报,對于懶漢有影響库说,因為如果不加鎖的話,當兩個線程訪問的時候燎竖,一開始都沒有對象璃弄,所以都想要去創(chuàng)建一個對象,結(jié)果可能會導致兩個線程創(chuàng)建了兩個對象构回,出現(xiàn)線程安全問題夏块。


線程之間的通信

多線程訪問不同資源稱為線程之間的通信

wait notify? 是object的方法

線程交互,當兩個線程操縱的是兩段代碼纤掸,而兩段代碼都操作了同一個資源脐供,如果想要兩段代碼互不影響,就要給兩段代碼加上同一個鎖借跪,使得一段代碼的鎖未釋放的時候政己,另一端代碼不可能執(zhí)行

notify的弊端:隨機喚醒一個被掛起的線程改進? ? ? ? ? notifyAll()喚醒所有被掛起的線程



synchronized的缺陷,多線程進行只讀操作的時候掏愁,也需要一個一個進行降低了效率由此引入lock

Lock替代了之前線程的synchronized代碼塊歇由,以面向?qū)ο蟮姆绞饺ソ鉀Q線程安全的問題,該對象使用起來更加的靈活(使用前要創(chuàng)建對象)

Lock()加鎖

Unlock()解鎖

Condition:替代之前Object對象中waitnotifynotifyAll三個方法果港,也是通過面向?qū)ο蟮姆绞饺ソ鉀Q問題沦泌。

Await掛起

Signal喚醒

SignalAll喚醒所有


如何把不安全的集合轉(zhuǎn)為線程安全的集合

Collections工具類中提供了一系列的把不安全的集合轉(zhuǎn)換為安全集合的方法只需要調(diào)用其方法即可


一個讀一個寫,如果想要寫完再讀需要怎么解決辛掠,需要給讀和寫加一個同一個鎖谢谦,這樣寫的鎖沒釋放,讀就不能解開鎖進行讀操作萝衩,這也就是生產(chǎn)者消費者的問題回挽,只有先生產(chǎn)才可能消費

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猩谊,隨后出現(xiàn)的幾起案子千劈,更是在濱河造成了極大的恐慌,老刑警劉巖预柒,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件队塘,死亡現(xiàn)場離奇詭異,居然都是意外死亡宜鸯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門遮怜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淋袖,“玉大人,你說我怎么就攤上這事锯梁〖赐耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長配椭。 經(jīng)常有香客問我匿乃,道長,這世上最難降的妖魔是什么初橘? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任验游,我火速辦了婚禮,結(jié)果婚禮上保檐,老公的妹妹穿的比我還像新娘耕蝉。我一直安慰自己,他們只是感情好夜只,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布垒在。 她就那樣靜靜地躺著,像睡著了一般扔亥。 火紅的嫁衣襯著肌膚如雪场躯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天旅挤,我揣著相機與錄音踢关,去河邊找鬼。 笑死谦铃,一個胖子當著我的面吹牛耘成,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驹闰,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瘪菌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘹朗?” 一聲冷哼從身側(cè)響起师妙,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屹培,沒想到半個月后默穴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡褪秀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年蓄诽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒吗。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡仑氛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锯岖,我是刑警寧澤介袜,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站出吹,受9級特大地震影響遇伞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捶牢,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一鸠珠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叫确,春花似錦跳芳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至次乓,卻和暖如春吓歇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背票腰。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工城看, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杏慰。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓测柠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缘滥。 傳聞我的和親對象是個殘疾皇子轰胁,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 本文主要講了java中多線程的使用方法、線程同步朝扼、線程數(shù)據(jù)傳遞赃阀、線程狀態(tài)及相應的一些線程函數(shù)用法、概述等擎颖。 首先講...
    李欣陽閱讀 2,458評論 1 15
  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,964評論 1 18
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍閱讀 7,357評論 3 87
  • Java-Review-Note——4.多線程 標簽: JavaStudy PS:本來是分開三篇的榛斯,后來想想還是整...
    coder_pig閱讀 1,655評論 2 17
  • 2011年,創(chuàng)業(yè)這個概念被抄的非陈酰火驮俗,隨便個有點資源、勇氣嘴巴會忽悠的人允跑,很輕易的就能找一筆錢出來意述,找個三五人支起...
    GOSS閱讀 261評論 0 1