為什么要使用并發(fā)機制?
- 并發(fā)指的是多個任務交替進行, 使用并發(fā)提高系統(tǒng)處理任務的能力,特別是現(xiàn)在大數(shù)據時代,對于單位時間系統(tǒng)處理數(shù)據的能力要求越來越高,能及時處理用戶請求,成為一種必要的系統(tǒng)需求。
并發(fā)中的鎖
鎖就是當一個線程獲得對資源使用權時,該線程就擁有了該資源的鎖,其他線程只能處于等待狀態(tài),當線程釋放對于臨界區(qū)的鎖時,其他線程才能根據優(yōu)先級去獲取臨界區(qū)資源的鎖。這里需要考慮線程的安全問題,當線程A占用了資源resourceA, 并且正在等待要被線程B占用的resourceb,這里就會出現(xiàn)相互等待,形成死鎖。那么如何去避免這種死鎖問題呢,可以有如下方式:
- 避免一個線程同時獲得多個鎖;
- 避免一個線程在鎖內部占有多個資源,盡量保證每個鎖只占用一個資源;
- 嘗試使用定時鎖,使用lock.tryLock(timeOut),當超時等待時當前線程不會阻塞;
- 對于數(shù)據庫鎖,加鎖和解鎖必須在一個數(shù)據庫連接里,否則會出現(xiàn)解鎖失敗的情況
經常碰到的一個問題時,在一個數(shù)據庫session里面,給session加了鎖,如果session的執(zhí)行過程順利,最后鎖會被釋放,但是并沒有考慮到當session中執(zhí)行失敗時并沒有去釋放鎖,這樣鎖無法釋放而最終導致嚴重的系統(tǒng)問題。
并發(fā)與并行的比較
- 并發(fā)是多個任務交替執(zhí)行,利用時間分片
- 并行發(fā)生在多個cpu環(huán)境中,當系統(tǒng)只有一個cpu時,只能通過時間分片執(zhí)行多線程功能,也就是并發(fā)執(zhí)行
同步與異步
- 同步,例如在一個沒有使用異步技術(ajax)的網站中,用戶提交一個請求,網站會在等待后臺的回復,在未拿到后臺數(shù)據之前,整個網頁都處于懸掛狀態(tài),用戶體驗感比較差
- 異步,較而言之,異步就是只需完成某項操作,無需關心整個執(zhí)行過程,比如網購,當你付款之后,其他事都不用管了,收到通知就去取貨就行。
阻塞和非阻塞
阻塞和非阻塞通常用來形容多線程間的相互影響,比如一個線程占有了臨界區(qū)資源,那么其他線程需要這個資源就必須進行等待該資源的釋放,會導致等待的線程掛起,這種情況就是阻塞,而非阻塞就恰好相反,它強調沒有一個線程可以阻塞其他線程,所有的線程都會嘗試地往前運行。
臨界區(qū)
臨界區(qū)用來表示一種公共資源或者說是共享數(shù)據,可以被多個線程使用。但是每個線程使用時,一旦臨界區(qū)資源被一個線程占有,那么其他線程必須等待。