Java線程入門第三篇

Java內存模型(jmm)

  • Why:保證多線程正確協同工做多線程

  • 看圖說明: 文字解釋:線程a和線程b通訊過程,首先線程a把本地內存的共享變量更新到主內存中,而後線程b去讀取主內存的共享變量,最後更新到本身的本地內存中 ###JMM涉及的特性以及規則app

  • 特性ide

    1.原子性:操做不可中斷,即一個線程操做不會被另外一個線程影響 特例:在32的操做系統中,long型不是原子性函數

    2.可見性:是指一個線程修改某個共享變量的值,另外一個線程可否馬上知道該共享變量的變化。性能

    常常出現可見問性問題是由於重排序操作系統

    重排序:編譯器和處理器爲了提升執行效率,改變語句執行順序,爲此jmm有happenbefore規則。線程

    3.有序性: 代碼語句按順序執行code

  • happenbefore規則對象

    happenbefore規則是jmm的核心:做用保證前一個操做對後一個操做可見(同一個線程或者不一樣線程)blog

    1.程序順序原則:一個線程內保證語義的串行性

    2.Volatile規則:volatile的寫,先發生於讀,這保證了volatile的可見性

    3.鎖規則:解鎖必然發生在隨後的加鎖前

    4.傳遞性:a先於b,b先於c,那麼a必然先於c

    5.線程的start()方法先於他的每個動做

    6.線程全部操做先於線程的終結

    7.線程的中斷先於被中斷線程的代碼

    8.對象的構造函數執行、結束先於finalize()方法

AQS同步器(抽象類)

Aqs源碼部分

  • 原理:使用int成員變量表示同步狀態,經過內置fifo隊列完成資源獲取線程的排隊工做

  • 他出名的兒子(繼承了aqs)

    1.ReentrantLock(類):你們都叫他重入鎖,由於他能夠重複加鎖,不過synchronized也有這功能。

    ReentrantLock源碼部分

    2.ReentrantReadWriteLock(類):你們都叫他讀寫鎖,他能夠聽時刻容許多線程進入,讀寫鎖比排它鎖(ReentrantLock)性能好,由於大多數狀況讀多於寫。 ReentrantReadWriteLock源碼部分

    3.CountDownLatch(類):你們叫他倒計時器,他容許一個或多個線程等待其餘線程完成操做。 CountDownLatch源碼部分

CyclicBarrier和CountDownLatch區別

  • CyclicBarrier

    1.同步屏障,用於多線程計算結果最後合併場景。

  • CountDownLatch

    1.CountDownLatch的計數器只能使用一次,cyclicbarrier的計數器能夠重置

線程池(擺脫原始的線程建立方法)

原理,即處理流程

  • 類圖:以下 類圖

  • 使用:

    1.經過ThreadPoolExecutor建立線程池 構造器源碼

  • 參數解釋:

    1.int corePoolSize :線程池基本大小

    2.BlockingQueue :阻塞隊列,用來保存等待執行的任務

    3.int maximumPoolSize:線程池最大數量,他與阻塞隊列關係是這樣4.審的,若是隊列滿了,線程池沒有滿,線程池會根據線程數量創執行任務。

    4.long keepAliveTime :空閒線程存或時間

    5.TimeUnit unit :線程活動保持時間的單位

  • 提交

    1.傳遞一個runnable(沒有返回值),須要返回值使用submit()方法。

    threadPoolExecutor.execute(new Runnable() {
        @Override
        public void run() {
    
        }
    });

公衆號

歡迎關注公衆號 布爾bl ,分享Java相關信息技術、生活感悟。

相關文章
相關標籤/搜索