《Java 多線程編程核心技術》- 筆記


  作為業務開發人員,能夠在工作中用到的技術其實不多。雖然平時老是說什么,多線程,並發,注入,攻擊!但是在實際工作中,這些東西不見得用得上。因為,我們用的框架已經把這些事做掉了。

  比如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();
      }
    }
  }

  額,這么看來,多線程的知識還是好少呢。東西不要太多,夠精就行!

      不用害怕多線程,不用害怕並發!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM