Java執行緒入門第三篇

布林bl發表於2019-01-04

Java記憶體模型(jmm)

  • Why:保證多執行緒正確協同工作

  • 看圖說明:

    Java執行緒入門第三篇
    文字解釋:執行緒a和執行緒b通訊過程,首先執行緒a把本地記憶體的共享變數更新到主記憶體中,然後執行緒b去讀取主記憶體的共享變數,最後更新到自己的本地記憶體中 ###JMM涉及的特性以及規則

  • 特性

    1.原子性:操作不可中斷,即一個執行緒操作不會被另一個執行緒影響 特例:在32的作業系統中,long型不是原子性

    2.可見性:是指一個執行緒修改某個共享變數的值,另一個執行緒能否立刻知道該共享變數的變化。 經常出現可見問性問題是因為重排序 **重排序:**編譯器和處理器為了提高執行效率,改變語句執行順序,為此jmm有happenbefore規則。

    3.有序性: 程式碼語句按順序執行

  • happenbefore規則

    happenbefore規則是jmm的核心:作用保證前一個操作對後一個操作可見(同一個執行緒或者不同執行緒)

    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() {
    
        }
    });
    複製程式碼

相關文章