標籤:null priority volatile 分配 方便 color 輸入 thread 定時器
作為業務開發人員,能夠在工作中用到的技術其實不多。雖然平時老是說什麼,多線程,並發,注入,攻擊!但是在實際工作中,這些東西不見得用得上。因為,我們用的架構已經把這些事做掉了。
比如web開發,外面有大量的請求進來,按理說,我們應該考慮並發問題。但其實,spring接到請求,分配到controller之後,就已經是安全執行緒的了,所以我們要做的就是,從controller開始,到最後請求響應結束,保證安全執行緒即可。
多線程好像有很多東西需要注意,閱讀《Java 多線程編程核心技術》後,做個總結,總體來說,其實也沒那麼多事,沒那麼複雜。
1. 多線程基礎
java的多線程,就體現在Thread類與Runable介面!共用資料,才存線上程安全問題,不共用資料不存線上程安全。java的很多停止線程的方法已經廢除,不建議使用如: resume,stop,suspend方法。設定線程優先順序(setPriority)可能提高線程執行的速度。守護線程的存在需要至少一個非守護線程在運行,也就是說守護線程不能獨立存在,其能力是比較低的,比如GC就是守護線程,當你的代碼在執行時,GC就在運行,隨時進行記憶體回收,當你的程式執行完成後,GC線程就不存在了。
2. 對象及變數的並發訪問
synchronized同步方法,鎖對象,鎖代碼塊,鎖方法,鎖變數,
valatile關鍵字,使用volatile線程解決同步死迴圈不停止問題。volatile強制從公用堆中獲得變數的值,使保持一致性。
3. 線程間通訊
wait/notify 是最基本的實現線程間通訊的方式。很方便的實現了,消費者/生產者模式。
wait方法後,立即釋放鎖,notify鎖不釋放。即wait方法執行後,後續並發請求即可進入該塊,而notify則需要等到synchronized代碼塊執行完成後,才會釋放鎖。
notifyAll()喚醒所有等待線程。
join()方法釋放鎖等待線程執行完成。Thread.sleep()不釋放鎖等待。
通過管道進行通訊,以字元流形式傳遞。PipeWriter,PipeReader,outputSream.connect(inputStream)將輸入資料流與輸出聯絡在 一起。
ThreadLocal,可認為是一個線程級的全域變數,即在本線程中,隨處都可以取到該值,而不必擔心安全執行緒問題。set(),get()方法進行設定與取用。
4. Lock的使用
ReentrantLock,
5. 定時器timer
timer.schedule(task, dateRef) 執行一次, timer.schedule(task, dateRef, period) 周期性執行。
6. 單例模式與多線程
if(obj == null) { synchronized(MyObject.class) { if(obj == null) { obj = new MyObject(); } } }
額,這麼看來,多線程的知識還是好少呢。東西不要太多,夠精就行!
《Java 多線程編程核心技術》- 筆記