java併發知識點

来源:https://www.cnblogs.com/jin-blogs/archive/2019/09/11/11509388.html
-Advertisement-
Play Games

前言 先列出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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、JVM包含三個記憶體區:棧記憶體、堆記憶體、方法區記憶體 二、註意點 (1)在MyEclipse中字體是紅色的是一個類的名字,並且這個類除了我們自定義的類是JavaSE類庫中自帶的 (2)其實JavaSE類庫中自帶的類,例如:String.class\System.class,這些類的類名也是標識符 ( ...
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
  • 作為開發人員,大家都知道,SpringBoot是基於Spring4.0設計的,不僅繼承了Spring框架原有的優秀特性,而且還通過簡化配置來進一步簡化了Spring應用的整個搭建和開發過程。另外SpringBoot通過集成大量的框架使得依賴包的版本衝突,以及引用的不穩定性等問題得到了很好的解決。 S ...
  • 如何逃離令人抓狂的 if-else 參數校驗的代碼,Van 帶你用validator快速搞定,節省更多的時間勾搭小姐姐。 ...
  • 原文再續,書接上一回 上回講到了,python IDLE的草稿本和作業本,並順便試了試python的輸入輸出,變數,運算的體驗,大家應該能感受到python的簡單了吧。 下麵我們繼續體驗python的強大,python之所以強大,是因為python有庫。(就如同人一樣學會了穿褲子也變得強大了) 課程 ...
  • 房天下 登錄 本次爬取的網址為: 一、分析請求 輸入用戶名和密碼,點擊登錄按鈕 請求的參數為: 就是輸入的用戶名, 是將密碼加密後的數據。我們只要找出密碼的加密方式就可以模擬登錄了。 二、密碼加密方式破解 這次我們以 作為關鍵字,進行搜索 找到加密位置之後,我們打上斷點,重新點擊登錄 找到密碼加密的 ...
  • 內容來自轉載整理 1.NumPy數值計算 NumPy是使用Python進行科學計算的基礎包,Numpy可以提供數組支持以及相應的高效處理函數,是Python數據分析的基礎,也是SciPy、Pandas等數據處理和科學計算庫最基本的函數功能庫,且其數據類型對Python數據分析十分有用。它包含: 一個 ...
  • 面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 里都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在互聯網公司里乾過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...