打算在每個專題的學習之前,寫一篇隨筆,記錄下自己對該專題認知的1.0版,以後持續迭代。我學習多執行緒有以下兩個原因:
一、多執行緒是高階開發人員必備的技能,我對多執行緒可以說仍是一知半解,停留在零散理論階段,未達到系統理論階段,更未達到實戰階段。工作中接觸到執行緒有三次,現在總結才發現都和定時任務有關,看來定時任務是多執行緒使用率比較高的乙個場景。
1、在第一家公司,寫了乙個簡單的單執行緒用於同步資料。
2、在第二家公司,用到公司封裝好的定時任務框架,當時覺得到封裝底層肯定是用到了執行緒,現在想想還用到了執行緒池。
說到這說乙個題外話,以前做開發,時間非常緊迫,每次都是奔著快速完成任務,沒有時間去比較哪種方式好,沒有時間去了解技術的底層,對個人的成長來說是不利的,尤其是對一些只能涉及一些業務層面開發的技術人員,除非自己有強烈的求知慾,但也得有那個精力不是。
二、曾經在好幾次的面試中被問及了j**a執行緒相關的問題,自己的回答總是不盡如人意,並且每次都會有新的問題出現,以下列舉下自己遇到的執行緒的面試問題,在以後的學習中逐個解開疑團。
1、j**a執行緒的實現方式
大家都知道的有兩種繼承thread類或者實現runable介面,有一次面試被問說還有一種方式,當然是不知道,後來自己查是實現callable介面,實現callable介面的執行緒是有返回值的。本質不是要記住這些方式,而是知道在什麼情況用。
2、j**a執行緒提供的方法
run()方法和start()方法,run()方法用於實現執行緒的任務,start()方法用於啟動執行緒,run方法和普通的j**a方法沒有本質區別。可能是因為一些面試中總是問到這兩個方法的區別,反而讓一些初學者有些混淆了。
還有thread類的其它一些,如sleep()、join()、yield()等,還有object類的wait()、notify/notifyall() 方法。這些方法中除了run()方法,其它方法都是通過jni
呼叫了作業系統對應的執行緒操作方法。
3、執行緒的同步,執行緒安全
以前在寫業務**的時候,遇到需要互斥訪問的**塊,會用到synchronized,synchronized的本質就是加鎖,只是這個鎖不用開發者自己加自己解,鎖有物件鎖和類鎖。volatile我在實際開發中沒有用到過,是在一次面試中被問到,後來特意查了一下,volatile可以實現執行緒對變數的可見性,但是不保證原子性,但在特定場景下還是很有用的,汗顏啊!
另外還有j**a提供的原子類如atomiclong、atomicinteger等。還有一些其它的執行緒同步方法,後面會詳細學習比較。
4、執行緒池
執行緒池以前在工作中沒寫過,但其實平時工作中一直都站在巨人的肩膀上,有意無意的享用著執行緒池,如資料庫連線池、tomca執行緒池,j**a執行緒池相關實現在j**a sdk並發包concurrent中,包括executor、executors、executorservice等,了解了一下並發包concurrent是併發大師doug lea設計的,是j**a1.5的特性,作為乙個j**a開發者,膜拜下。
以上是我對多執行緒的所知所想,屬於是跳出來看全域性吧,後面準備鑽進去看本質,期待自己在多執行緒程式設計上能持續深耕,有質的突破。
寫在畢業之前
人生有很多抉擇,就象人經常站點三叉路口一樣。在學校的生活總是很愜意的,因為這裡可以認識非常多的沒有心計的朋友 激發自己創意靈感 和保持一顆很有野心的抱負。現在快畢業了,想起來真的很快,這3年,彈指一揮間。留下了很多美好的回憶,同時也給自己留下來許多遺憾,不過還好,我總是能自醒,知道自己落後了,然後就...
寫在之前blog
寫在之前 再從2014年的同學偶遇聊天,踏上linux之路,走上計算機行業,5年了,直到今天的我才發現自己已經跟資料庫,資料,應用打了這麼多年的交道,現在計算機行業工作的不景氣偏偏促使我寫下我自己的工作經歷和生活中遇到的問題 之前這幾年遇到的問題,不想寫了,以後或許會寫一些之前遇到的問題和使用經歷,...
寫在大三之前
不知不覺的自己的大二生活就這樣結束了,乙個月的瘋狂突擊期末複習現在畫上了乙個句號。在大學這兩年中發現自己總是平時不認真學習,到了期末的時候才瘋狂追趕,不知道自己這樣做到底對還是錯。經歷了大一上時的無知 大一下時的無奈,大二時我懂得了如何把握大學的生活 學習,曾經憧憬的大學生活原來是這樣的!今天期末考...