一.線程組件
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();