作為一個程式員,雖然是軟體開發,但是軟體開發說到底還是得和底層硬體互動,如果對硬體不了解,那就無法更深入的去學習,一個程式是如何運行的?資料又是如何從硬碟中被程式讀取到?為什么會存在執行緒安全問題?怎樣才能保證程式安全,同時又提高并發量?我個人認為以下基礎知識點應該是每個初級程式員應該知道的常識,如果不知道這個那根本沒法繼續研究更加深入的底層知識,
程式的運行程序

程式在磁盤中是一個個檔案,當打開exe格式的檔案的時候,檔案就會以資料流的形式被加載到記憶體,這時候程式就會變成一個行程,一個行程會有多個執行緒,每個執行緒又會各自系結自己的堆疊,執行緒通過cpu調度執行就可以完成一個個功能,cpu會讀取程式中的一條條二進制指令進行處理,并回傳到記憶體中,cpu中的pc暫存器就是存盤執行的執行緒的記憶體地址,通過pc暫存器可以確保該執行哪條指令,Registers是存盤pc暫存器存盤的記憶體地址中的資料,ALU:邏輯運算單元,負責將資料進行運算得出結果,cache:快取,會將ALU得到的結果放入快取并寫入記憶體,當這個結果一直沒有改變的時候下一次獲取該資料的時候可以直接從快取中獲取,極大的提升了運算效率,
執行緒安全
什么是執行緒?執行緒就是行程的最小調度單位,如果說360安全衛士是一個行程,那么里面的某個木馬查殺功能就是一個執行緒,執行緒有兩類:守護執行緒(Daemon)和用戶執行緒(
User Thread),gc執行緒就是一個守護執行緒,主執行緒就是一個用戶執行緒,守護執行緒用于服務用戶執行緒,當用戶執行緒結束任務關閉的時候,jvm不管守護執行緒在不在都會自動退出,執行緒安全問題一定是發生在多執行緒的情況下,如果是單執行緒,那不存在并發問題,
現在程式基本上都是多執行緒,單執行緒效率低,而且很容易出現一個問題:執行緒阻塞導致接下來的任務沒法執行,
多執行緒又分為單核多執行緒和多核多執行緒,
單核多執行緒:一個cpu內核執行多個執行緒,多個執行緒爭奪cpu時間片,在一段時間內做某些事情,這就是并發,
多核多執行緒:多個cpu內核執行多個執行緒,因為比單核多了幾個內核,雖然也是多執行緒爭奪cpu時間片,但是確確實實是在同一個時間點在做幾個事情,這就是并行!效率比一般并發都要快,同時現在大多數也是這種情況,微觀上來看,多核多執行緒底層還是單核多執行緒,
多執行緒操作雖然效率高了,但是會存在一個安全隱患問題:多個執行緒對同一個物件做修改造成資料嚴重丟失,最經典的莫過于買票問題:很有可能出現幾個執行緒對同一張車票做處理導致一個票被賣了多次,
針對執行緒安全問題就出現了鎖這種東西,當多個執行緒對同一個物件操作時,只有獲取到鎖的單位才能對他進行修改,
java鎖有四種 無鎖,偏向鎖,自旋鎖,重鎖,鎖的升級程序不可逆,鎖的降級只有一種可能,gc回收,所以降級無意義,
以上都是我的個人見解,圖片素材借鑒馬老師視頻,如有疑問歡迎討論!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36333.html
標籤:Java
下一篇:java基本資料型別的轉換
