编程知识 cdmana.com

分享面試經曆的網站,騰訊大牛教你自己寫Java框架!

1、上下文切換

上下文定義

cpu發生進程或者線程切換時,所依賴的數據集合,比如一個函數有外部變量,函數運行時,必須獲取外部變量,這些變量值的集合就是上下文。

引發問題

對於CPU密集型任務,多線程處理會發生上下文切換,會影響到執行速度,如果時IO密集型,多線程技術優點盡顯。

如何减少上下文切換

  • 無鎖並發編程,鎖的獲取與釋放會發生上下文切換,多線程時會影響效率。無鎖並發編程就是將數據分塊,每個線程處理各自模塊。比如LongAdder中部分代碼。
  • CAS算法,並發編程時通過CAS算法更新數據,而不必加鎖。如Java的atomic包下的工具類。
  • 使用最少線程,减少不必要的線程創建,自定義線程池。
  • 使用協程,在單線程中維護多任務調度,處理任務間切換,Golang對於協程的使用很强大。

2、死鎖

死鎖定義

死鎖是進程死鎖的簡稱,是由Dijkstra於1965年研究銀行家算法時首先提出來的。
系統發生死鎖現象不僅浪費大量的系統資源,甚至導致整個系統崩潰,帶來灾難性後果。

分享面試經曆的網站,騰訊大牛教你自己寫Java框架!_後端

產生死鎖原因

  • 系統資源不足
  • 進程推進順序不當
  • 資源分配不合理

死鎖產生的必要條件

  • 互斥條件:一個資源只能被一個進程或者線程使用。
  • 請求和保持條件:一個進程或者線程,請求資源的時候發生阻塞,對已經獲取的資源保持不放。
  • 不可剝奪條件:進程或者線程以獲得的資源,在未使用完成時,不能强行剝奪。
  • 循環等待條件:若幹進程或者線程形成一種頭尾相接的循環等待的資源關系。

這四分條件是死鎖產生的必要條件,只要發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

如何避免死鎖

  1. 以確定的順序獲得鎖
  2. 加鎖時限

Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,該方法可以按照固定時長等待鎖,因此線程可以在獲取鎖超時以後,主動釋放之前已經獲得的所有的鎖。

最後

無論是哪家公司,都很重視基礎,大廠更加重視技術的深度和廣度,面試是一個雙向選擇的過程,不要抱著畏懼的心態去面試,不利於自己的發揮。同時看中的應該不止薪資,還要看你是不是真的喜歡這家公司,是不是能真的得到鍛煉。

針對以上面試技術點,我在這裏也做一些資料分享,希望能更好的幫助到大家。

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

分享面試經曆的網站,騰訊大牛教你自己寫Java框架!_後端_02

分享面試經曆的網站,騰訊大牛教你自己寫Java框架!_Java_03

分享面試經曆的網站,騰訊大牛教你自己寫Java框架!_Java_04

版权声明
本文为[程序小茉莉]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210915055829945D.html

Scroll to Top