線程池及併發包

一.線程組件

1.線程池

1.1.線程池類型:newSingleThreadExecutor、newFixedThreadPool 等等

1.2. 線程池參數:

        

1.3.線程池執行原理以及關閉原理:

       

 

 

        

        

        

1.4.線程池終止(具體代碼看上述截圖):

    shutdown:線程池將變shutdown狀態,此時不接收新任務,但會處理完正在運行的 和 在阻塞隊列中等待處理的任務。

    shutdownNow:線程池變stop狀態,此時不接收新任務,不再處理在阻塞隊列中等待的任務,還會嘗試中斷正在處理中的工作線程。

2.阻塞隊列(略)

 

二.線程方法

    包括join(long millis)、wait(long millis)、future、callable等原理。

1. join原理:在ThreadA中調用ThreadB.join();

     

2. callbale原理: https://blog.csdn.net/u012664375/article/details/66967687

3. ReentrantLock/ReadWriteLock/Semaphore原理

3.1. ReentrantLock原理(以非公平鎖舉例):

        lock.lock()源碼如下圖所示:

         

         

         

 

 

lock.unlock()原理如下圖所示:

        

        

3.2.ReadWriteLock原理(以非公平鎖舉例):

      ReentrantReadWriteLock.readLock().lock()

       

 

    ReentrantReadWriteLock.writeLock().lock()原理類似於ReentrantLock的nonfairTryAcquire

3. Semaphore原理(以非公平鎖舉例)(略):

4.  threadllocal原理:

      

     用線程池時若用threadLocal,因爲核心線程始終不變,那麼核心線程對應的value也不變,則會造成內存泄漏或者生產問題。

三.線程應用場景:生產者消費者、讀寫問題

 1. 參照 https://www.cnblogs.com/xkxf/p/7890686.html

 2. 無鎖隊列

    

 

四.線程鎖機制:

樂觀鎖、悲觀鎖;可重入鎖、讀寫鎖;自旋鎖;

小結:樂觀鎖,在ReentrantLock和Sempahore應用的cas;如ReentrantLock首先cas操作,cas失敗則加入AQS的CLH隊列,否則在進度共享代碼塊內,若代碼塊內有Condition,則會在Condition.await()處阻塞、此處爲重量級鎖;

          公平鎖與非公平鎖,如ReentrantLock的lock.lock()是否立即cas操作;是則爲非公平鎖;

          偏向鎖:readlock.lock()首先檢查當前是否已有排他鎖,若已有排他鎖則直接加入aqs,若無排他鎖,則cas獲取權限;此時偏向鎖變爲樂觀鎖;

          可重入鎖:ReentrantLock在compareAndSetState失敗時,若當前線程是成員變量state的set成功的那個線程,則不再加入CLH以及selfInterrupt(); 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章