做爲業務開發人員,可以在工做中用到的技術其實很少。雖然平時總是說什麼,多線程,併發,注入,攻擊!可是在實際工做中,這些東西不見得用得上。由於,咱們用的框架已經把這些事作掉了。java
好比web開發,外面有大量的請求進來,按理說,咱們應該考慮併發問題。但其實,spring接到請求,分配到controller以後,就已是線程安全的了,因此咱們要作的就是,從controller開始,到最後請求響應結束,保證線程安全便可。web
多線程好像有不少東西須要注意,閱讀《Java 多線程編程核心技術》後,作個總結,整體來講,其實也沒那麼多事,沒那麼複雜。spring
1. 多線程基礎編程
java的多線程,就體如今Thread類與Runable接口!共享數據,才存在線程安全問題,不共享數據不存在線程安全。java的不少中止線程的方法已經廢除,不建議使用如: resume,stop,suspend方法。設置線程優先級(setPriority)可能提升線程執行的速度。守護線程的存在須要至少一個非守護線程在運行,也就是說守護線程不能獨立存在,其能力是比較低的,好比GC就是守護線程,當你的代碼在執行時,GC就在運行,隨時進行內存回收,當你的程序執行完成後,GC線程就不存在了。安全
2. 對象及變量的併發訪問多線程
synchronized同步方法,鎖對象,鎖代碼塊,鎖方法,鎖變量,併發
valatile關鍵字,使用volatile線程解決同步死循環不中止問題。volatile強制從公共堆中得到變量的值,使保持一致性。框架
3. 線程間通訊spa
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(); } } }
額,這麼看來,多線程的知識仍是好少呢。東西不要太多,夠精就行!
不用懼怕多線程,不用懼怕併發!