【高并發】導致并發編程頻繁出問題的“幕后黑手”
大家好,我是冰河~~
工作了3年的小菜同學,平時在公司只是做些CRUD的常規工作,這次,出去面試被面試官一頓虐啊!尤其是并發編程的知識簡直就是被吊打啊。小菜心有不甘,回來找自己工作經驗非常豐富的朋友大冰來幫助自己提升并發編程的知識,于是便有了接下來的一系列小菜學并發的文章。
并發編程的難點
并發編程一直是很讓人頭疼的問題,因為多線程環境下不太好定位問題,它不像一般的業務代碼那樣打個斷點,debug一下基本就能夠定位問題所在。并發編程中,出現的問題往往都是很詭異的,而且大多數情況下,問題也不是每次都會重現的。那么,我們如何才能夠更好的解決并發問題呢?這就需要我們了解造成這些問題的“幕后黑手”究竟是什么!
操作系統做出的努力
計算機的制造商為了提升計算機的整體性能,對計算機做出了相應的優化措施。
CPU增加了緩存
CPU對于數據的計算速度遠遠高于從內存中存取數據的速度,我們可以想象一下,如果說,CPU對于數據的計算需要一天時間,那么,從內存中讀取和寫入數據可能分別需要1年的時間。也就是說,在這一年365天當中,CPU只需要工作一天,而364天的時間都在等待從內存中讀取或者存儲數據。這對于CPU的利用率來說,就是極大的浪費了。
為了緩和CPU與內存之間的速度差異,計算機的制造商為CPU增加了緩存。
操作系統增加了進程和線程
CPU的速度比內存快的多,而內存又比磁盤快的多。如果說,CPU運算需要一天的時間,從內存讀取數據需要一年的話,那從磁盤讀取數據就需要10年的時間了。沒錯,磁盤就是這么慢啊!
為了緩和CPU和磁盤設備之間的速度差異,操作系統的制造商增加了進程和線程技術。
優化CPU指令執行順序
我們寫的并發程序在操作系統上運行時,對于CPU緩存的使用可能會不太合理,造成CPU緩存的浪費。
為了使CPU的緩存能夠得到更加合理的利用,編譯程序對CPU上指令的執行順序進行了優化。
揪出“幕后”黑手
計算機和操作系統的制造商對計算機和操作系統進行的優化,在無形當中造成了很多并發編程的問題。本質上,并發編程的很多詭異的問題源頭也在于此,這也是并發編程頻繁出問題的“幕后黑手”。所以,我們可以將“幕后黑手”總結如下。
沒錯,這就是造成并發編程問題的“幕后黑手”!!后面我們將分別細化說明這些“幕后黑手”。
總結
了解并掌握并發編程問題的“幕后黑手”,有助于我們更好的學習并發知識和解決并發問題。
最后,附上并發編程需要掌握的核心技能知識圖,祝大家在學習并發編程時,少走彎路。
總結
并發編程旨在最大限度的利用計算機的資源,提高程序執行的性能,這需要線程之間的分工和同步來實現,在保證性能的同時,又需要保證線程的安全,這就又需要保證線程之間的互斥性。而并發編程的難點問題,往往又是由可見性、原子性和有序性問題導致的。所以,我們在學習并發編程時,一定要先弄懂線程之間的分工、同步和互斥。
最后,附上并發編程需要掌握的核心技能知識圖,祝大家在學習并發編程時,少走彎路。
推薦閱讀
《要想學好并發編程,關鍵是要理解這三個核心問題》
《實踐出真知:全網最強秒殺系統架構解密,不是所有的秒殺都是秒殺!!》
《一文搞懂線程與線程池》
《Java中線程到底是按什么順序執行的?你了解的可能是錯誤的!》
《學好并發編程,關鍵是要理解這三個核心問題!》
《高并發系統為何使用消息隊列?》
《深入解析Callable接口》
《兩種異步模型與深度解析Future接口(一)》
《兩種異步模型與深度解析Future接口(二)》
《線程的執行順序與你想的不一樣!!》
《SimpleDateFormat類的線程安全問題和解決方案(問題篇)》
《SimpleDateFormat類的線程安全問題和解決方案(解決方案篇一)》
《SimpleDateFormat類的線程安全問題和解決方案(解決方案篇二)》
《不得不說的線程池與ThreadPoolExecutor類淺析》
《深度解析線程池中那些重要的頂層接口和抽象類》
《從源碼角度分析創建線程池究竟有哪些方式》
《通過源碼深度解析ThreadPoolExecutor類是如何保證線程池正確運行的》
《通過ThreadPoolExecutor類的源碼深度解析線程池執行任務的核心流程》
《通過源碼深度分析線程池中Worker線程的執行流程》
《ScheduledThreadPoolExecutor與Timer的區別和簡單示例》
《深度解析ScheduledThreadPoolExecutor類的源代碼》
《由InterruptedException異常引發的思考》
《淺談AQS中的CountDownLatch、Semaphore與CyclicBarrier》
《ReentrantLock、ReentrantReadWriteLock、StampedLock與Condition》
《朋友去面試竟然栽在了Thread類的源碼上》
《如何使用Java7提供的Fork/Join框架實現高并發程序?》
好了,今天就到這兒吧,我是冰河,我們下期見~~
await Java JDK 任務調度 多線程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。