前言 先列出java併發涉及的知識點,後面再慢慢補. java併發 1 常見概念 進程:程式執行的實體,操作系統資源調度資源分配的基本單元 線程:程式執行的最小單元,擁有獨立的堆棧和局部變數等屬性,可以共用進程的資源 同步是串列執行,阻塞 非同步是並行執行,非阻塞 併發:多個任務交替執行 並行:多個任 ...
前言
先列出java併發涉及的知識點,後面再慢慢補.
java併發
1 常見概念
進程/線程
- 進程:程式執行的實體,操作系統資源調度資源分配的基本單元
- 線程:程式執行的最小單元,擁有獨立的堆棧和局部變數等屬性,可以共用進程的資源
同步(Synchronous)/非同步(Asynchronous)
- 同步是串列執行,阻塞
- 非同步是並行執行,非阻塞
併發/並行
- 併發:多個任務交替執行
- 並行:多個任務同時執行
臨界區
阻塞(Blocking)/非阻塞(Non-Blocking)
死鎖/饑餓/活鎖
JMM(java記憶體模型)
- 可見性
- 原子性
- 有序性
併發級別
- 阻塞(加鎖阻塞)
- 無饑餓(公平鎖實現無饑餓)
- 無鎖(CAS)
- 無等待(Read-Copy-Update)
2 多線程基礎
線程狀態
- New:新建
- Runnable:運行中
- Blocked:阻塞, 等待鎖是blocked
- Waiting:等待,Object.wait/Condition.await操作釋放鎖,線程進入等待狀態
- Time-Waiting:超時等待, sleep()操作,不會釋放鎖
- Terminated:結束
基本操作
- 新建:Thread/Runnable
- 終止:stop(廢棄)/interrupt
- 等待(wait)/通知(notify),必須配合Synchronous使用
- 掛起(suspend)/只需執行(resume),已廢棄
- 等待線程結束join
- 謙讓yield
- 優先順序priority
線程池
Excutor
ExcutorService擴展Excutor
ThreadPoolExcutor線程池對象
Executors線程池工廠,返回指定類型的線程池對象
原理:
1線程池對象的構造函數:
- corePoolSize:線程池中的線程數量
- maximumPoolSize:線程池最大線程數量
- keepAliveTime:超過corePoolSize數量額線程的存活時間
- unit:時間單位
- workQueue:任務隊列,有界隊列:ArrayBlockingQueue/無界隊列:LinkedBlockingQueue
- handler:拒絕策略
2線程池工廠:ThreadFactory,使用該工廠創建線程
3 鎖
synchronized
- 原理:在JVM編譯後,在入口處加上Monitorenter指令,結束位置或異常處加上monitorexit的指令;
- 作用:保證了JMM的三個特性:原子性/可見性(unlock之前保證變數會同步到主記憶體中去)/有序性(變數同一時刻只能由一個線程處理)
Lock/ReentrantLock
- 細粒度的鎖,有lock()/unlock()/trylock操作;
- 可以實現公平鎖和非公平鎖(預設)
- 原理:AQS
volatile
- 保證可見性,不保證原子性
- 禁止指令重排序保證有序性
ThreadLocal
保存的數據可以看作線程內部局部變數;
實現:實現:當前線程有個ThreadLocalMap表,存儲著當前ThreadLocal實例和對應的value;
樂觀鎖CAS(compare and swap)
synchronized和lock是悲觀鎖,CAS就是樂觀鎖
實現:修改數據時,需要三個參數:記憶體地址,舊的值,新的值, 只有舊的值等於當前記憶體地址中保存的值,才會更新為新的值
jvm對鎖的優化:
- 鎖消除:jvm會判斷加鎖的代碼是否真的需要加鎖,如果不需要會執行不加鎖操作;
- 自旋鎖:競爭鎖失敗後不會立即被掛起(線程的掛起需要操作系統配合,耗費資源),而是類似有個while(true)迴圈多少次後再去競爭鎖;
- 偏向鎖:同一個線程重覆訪問一個同步代碼塊時,可以直接獲取到鎖,免去了CAS加鎖解鎖的操作,使用鎖競爭少的場景;
- 輕量級鎖:
- 重量級鎖
提高鎖性能的建議
- 減少鎖持有的時間
- 減少鎖粒度
- 鎖分離:讀寫鎖
- 鎖的粗化:頻繁加鎖釋放鎖也是不小的開銷,粗化減少加鎖次數
4 JUC併發包
Condition
Semaphore信號量
ReadWriteLock讀寫鎖
CountDownLatch倒計時器
CycliBarrier柵欄
LockSupport線程阻塞工具
Fork/join
AQS(AbstractQueuedSynchronized)併發基礎組件
併發容器
- 線程安全的Map:ConcurrentMap
- 線程安全的List:CopyOnWriteArrayList
- 高效隊列ConcurrentLinkedQueue
- 阻塞隊列BlockingQueue
- 雙向隊列Deque
- 隨機數據結構SkipList