線程核心之同步,死鎖,交互

同步


多個線程同時修改一個數(shù)據(jù)時(也叫并發(fā)操作),容易導(dǎo)致同步問題(同時修改),產(chǎn)生臟數(shù)據(jù)

解決方法

在多個線程同時修改的數(shù)據(jù)上加鎖,當(dāng)一個線程修改時,另外的線程排隊(duì)等待,直到釋放鎖后其它線程才能占用,避免同時修改問題

MyStack實(shí)例代碼

  1. syschronized實(shí)現(xiàn)代碼

  2. Lock實(shí)現(xiàn)代碼

死鎖


  1. 線程1占用A,接著請求占用B
  2. 線程2占用B,接著請求占用A
  3. 就這樣,兩個線程占用各自的,請求對方的,就形成死鎖
來自 how2j.cn

解決方法

  1. synchronized必須通過謹(jǐn)慎和良好的設(shè)計(jì),才能減少死鎖的發(fā)生。
  2. Lock可以選擇性的獲取鎖,trylock()會在指定時間范圍內(nèi)試圖占用,沒有占用成功會繼續(xù)往下走
// Lock 核心代碼
boolean locked = lock.tryLock(1,TimeUnit.SECONDS);
if(locked){
    // 申請占用成功操作
}else{
    // 沒有占用成功操作
}

交互


所謂交互,就是線程之間的交互通知

  1. syschronized 交互:wait(), notify(), notifyAll()
  2. Lock 交互:await(), signal(), signalAll()

生產(chǎn)者消費(fèi)者問題

生產(chǎn)者消費(fèi)者問題是一個非常典型性的線程交互的問題。它們公有一個緩沖區(qū),該問題的關(guān)鍵就是要保證生產(chǎn)者不會在緩沖區(qū)滿時加入數(shù)據(jù),消費(fèi)者也不會在緩沖區(qū)中空時消耗數(shù)據(jù)。

實(shí)現(xiàn)方法

  1. 使用棧來存放數(shù)據(jù)
    1. 把棧改造為支持線程安全
    2. 把棧的邊界操作進(jìn)行處理,當(dāng)棧里的數(shù)據(jù)是0的時候,訪問pull的線程就會等待。 當(dāng)棧里的數(shù)據(jù)時200的時候,訪問push的線程就會等待
  2. 提供一個生產(chǎn)者(Producer)線程類,生產(chǎn)隨機(jī)大寫字符壓入到堆棧
  3. 提供一個消費(fèi)者(Consumer)線程類,從堆棧中彈出字符并打印到控制臺
  4. 提供一個測試類,使兩個生產(chǎn)者和三個消費(fèi)者線程同時運(yùn)行

代碼

  1. syschronized實(shí)現(xiàn)代碼

  2. Lock實(shí)現(xiàn)代碼

線程池


使用原因

每個線程的啟動和結(jié)束是比較消耗時間和占用內(nèi)存的(每個線程需要1MB內(nèi)存,線程開的越多,消耗的內(nèi)存越大,最后會死機(jī)),為了解決這個問題,所以引入線程池的概念

設(shè)計(jì)原理

線程池的思路與消費(fèi)者生產(chǎn)者模型很相似,主要兩函數(shù),任務(wù)添加 和 運(yùn)行任務(wù)

  1. 準(zhǔn)備一個任務(wù)容器
  2. 一次性啟動10個(根據(jù)需要)消費(fèi)線程
  3. 剛開始任務(wù)容器是空的,所以線程都是 wait()
  4. 直到外部環(huán)境往任務(wù)容器里放進(jìn)“任務(wù)”,就會有消費(fèi)線程被喚醒notify()
來自 how2j.cn

實(shí)例代碼

自定義線程池代碼

區(qū)別

生產(chǎn)者消費(fèi)者和線程池實(shí)現(xiàn)的區(qū)別在于:前一個是手動消費(fèi),后一個是自動消費(fèi)

參考

http://how2j.cn/k/thread/thread-start/353.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 引用自多線程編程指南應(yīng)用程序里面多個線程的存在引發(fā)了多個執(zhí)行線程安全訪問資源的潛在問題。兩個線程同時修改同一資源有...
    Mitchell閱讀 2,131評論 1 7
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,901評論 11 349
  • 也許是怕了,也許不是那么的重要了??粗矚g的你,最后還是告訴自己算了吧。自從放假以來,我變得比以前愛發(fā)動態(tài)了,我知...
    愛一個人很愛閱讀 144評論 0 0
  • 38#:明粹 蕭紅,二十世界三十年代東北作家群的女作家之一,她是位歷經(jīng)坎坷、英年早逝的天才作家。 蕭紅出生在黑龍江...
    豆南國閱讀 294評論 0 0
  • 現(xiàn)在每天睡覺前都會想著要完成仰臥起坐的計(jì)劃,有睡覺前的儀式感的趕腳。躺下起來,完成10個用的時間很短,估計(jì)不到1分...
    星朗月明閱讀 191評論 0 0

友情鏈接更多精彩內(nèi)容