JAVA高級進階11多線程

第十一天、多線程

線程安全問題

線程安全問題

  • 多線程給我們帶來了很大性能上的提升,但是也可能引發線程安全問題

  • 線程安全問題指的是當個多線程同時操作同一個共享資源的時候,可能會出現的操作結果不符預期問題

線程同步方案

認識線程同步

線程同步

  • 線程同步就是讓多個線程先后依次訪問共享資源,這樣就解決了安全問題,它最常見的方案就是加鎖

  • 加鎖 : 每次只允許一個多線程加鎖,加鎖后才能進入訪問 ,訪問完畢后自動解鎖,之后其它線程才能加鎖進來

方式一 : 同步代碼塊

同步代碼塊

  • 作用 : 把訪問共享資源的核心代碼給上鎖,以此保證線程安全

  • synchronized(同步鎖) {訪問共享資源的核心代碼
    }
  • 原理 : 每次只允許一個線程加鎖后進入,執行完畢后自動解鎖,其他線程才可以進來執行

同步鎖的注意事項

  • 對于當前同時執行的線程來說,同步鎖必須是同一把鎖(同一個對象),否則會出bug

  • 對于實列方法建議使用this作為鎖對象

  • 對于靜態方法建議使用字節碼(類名.class)對象作為鎖對象

方式二:同步方法

同步方法

  • 作用:把訪問共享資源的核心方法給上鎖,以此保證線程安全

  • 修飾符 synchronized 返回值類型 方法名稱(形參列表) {操作共享資源的代碼
    }
  • 原理:每次只能一個線程進入,執行完畢以后自動解鎖,其他線程才可以進來執行

同步方法底層原理

  • 同步方法其實底層也是有隱式鎖對象的,只是鎖的范圍是整個方法代碼

  • 如果方法是實例方法:同步方法默認用this作為的鎖對象

  • 如果方法是靜態方法:同步方法默認用類名.class作為的鎖對象

方式三:Lock鎖

Lock鎖

  • Lock鎖是JDK5開始提供的一個新的鎖定操作,通過它可以創建出鎖對象進行加鎖和解鎖,更靈活、更方便、更強大

  • Lock是接口,不能直接實例化,可以采用它的實現類ReentrantLock來構建Lock鎖對象

Lock的常用方法

線程池

認識線程池

當前創建線程的問題

  • 用戶每發起一個請求,后臺就需要創建一個新線程來處理,任務處理完畢之后,線程就會被銷毀

  • 下次新任務來了肯定又要創建新線程處理的,用完又要被銷毀

  • 而創建和銷毀線程的開銷是很大的,當請求過多時,肯定會產生大量的線程出來,這樣會嚴重影響系統的性能

什么是線程池

  • 線程池就是一個可以復用線程的技術

  • 它就像一個大的池子一樣,里面可以放置一些線程,當需要的時候,就從里面取出來用,用完了就還回去

  • 如此一來,就不必頻繁的創建和銷毀線程了,大大的提高了線程的利用率,提供系統的性能

線程池的工作原理以及執行流程

  • 判斷核心線程數是否已滿,如果沒滿,則創建一個新的核心線程來執行任務

  • 如果核心線程滿了,則判斷工作隊列是否已滿,如果沒滿,則將任務存儲在這個工作隊列

  • 如果工作隊列滿了,則判斷最大線程數是否已滿,如果沒滿,則創建臨時線程執行任務

  • 如果最大線程數已滿,則執行拒絕策略

如何創建線程池?

誰代表線程池?

  • JDK 5.0起提供了代表線程池的接口:ExecutorService

如何得到線程池對象?

  • 使用ExecutorService的實現類ThreadPoolExecutor自創建一個線程池對象

ThreadPoolExecutor

  • 參數一:corePoolSize : 指定線程池的核心線程的數量

  • 參數二:maximumPoolSize:指定線程池的最大線程數量

  • 參數三:keepAliveTime :指定臨時線程的存活時間

  • 參數四:unit:指定臨時線程存活的時間單位(秒、分、時、天)

  • 參數五:workQueue:指定線程池的任務隊列

  • 參數六:threadFactory:指定線程池的線程工廠

  • 參數七:handler:指定線程池的任務拒絕策略(線程都在忙,任務隊列也滿了的時候,新任務來了該怎么處理)

任務緩沖隊列

任務拒絕策略

線程池處理Runnable任務

ExecutorService的常用方法

線程池處理Callable任務

ExecutorService的常用方法

Executors工具類實現線程池

Executors

  • 是一個線程池的工具類,提供了很多靜態方法用于返回不同特點的線程池對象

  • 注意 :這些方法的底層,都是通過線程池的實現類ThreadPoolExecutor創建的線程池對象

Executors使用可能存在的陷阱

  • 大型并發系統環境中使用Executors如果不注意可能會出現系統風險

線程通信(了解)

什么是線程通信?

  • 當多個線程共同操作共享的資源時,線程間通過某種方式互相告知自己的狀態,以相互協調,并避免無效的資源爭奪

線程通信的常見模型(生產者與消費者模型)

  • 生產者線程負責生產數據

  • 消費者線程負責消費生產者生產的數據

  • 注意:生產者生產完數據應該等待自己,通知消費者消費;消費者消費完數據也應該等待自己,再通知生產者生產

Object類的等待和喚醒方法

注意

  • 上述方法應該使用當前同步鎖對象進行調用

理論補充

進程與線程

進程與線程

  • 進程:正在運行的程序(軟件)就是一個獨立的進程

  • 線程:線程是屬于進程的,一個進程中可以同時運行很多個線程

  • 關系:進程=火車 線程=車廂

并發與并行

并發的含義

  • 進程中的線程是由CPU負責調度執行的,但CPU能同時處理線程的數量有限,為了保證全部線程都能往前執行, CPU會輪詢為系統的每個線程服務,由于CPU切換的速度很快,給我們的感覺這些線程在同時執行,這就是并發

并行的含義

  • 在同一個時刻上,同時有多個線程在被CPU調度執行

多線程到底是怎么在執行的?

  • 并發和并行同時進行的

線程生命周期

線程的生命周期和狀態

  • 也就是線程從生到死的過程中,經歷的各種狀態及狀態轉換,Java總共定義了6種狀態

線程的6種狀態互相轉換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41121.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內網滲透學習-殺入內網

1、靶機上線cs 我們已經拿到了win7的shell,執行whoami,發現win7是administrator權限,且在域中 執行ipconfig發現了win7存在內網網段192.168.52.0/24 kali開啟cs服務端 客戶端啟動cs 先在cs中創建一個監聽器 接著用cs生成后門,記…

Mysql 的第二次作業

一、數據庫 1、登陸數據庫 2、創建數據庫zoo 3、修改數據庫zoo字符集為gbk 4、選擇當前數據庫為zoo 5、查看創建數據庫zoo信息 6、刪除數據庫zoo 1)登陸數據庫。 打開命令行,輸入登陸用戶名和密碼。 mysql -uroot -p123456 ? 2)切換數據庫…

菜雞的原地踏步史(???)

leetcode啟動!(╯‵□′)╯︵┻━┻ 嘗試改掉想到哪寫哪的代碼壞習慣 鏈表 相交鏈表 public class Solution {/**ac(公共長度)b所以 鏈表A的長度 a c,鏈表B的長度b ca b c b c a只要指針a從headA開始走,走完再…

利用pg_rman進行備份與恢復操作

文章目錄 pg_rman簡介一、安裝配置pg_rman二、創建表與用戶三、備份與恢復 pg_rman簡介 pg_rman 是 PostgreSQL 的在線備份和恢復工具。類似oracle 的 rman pg_rman 項目的目標是提供一種與 pg_dump 一樣簡單的在線備份和 PITR 方法。此外,它還為每個數據庫集群維護…

抖音使矛,美團用盾

有市場,就有競爭。抖音全力進軍本地生活市場欲取代美團,已不是新聞。 互聯網行業進入存量時代,本地生活市場是為數不多存在較大增長空間的賽道。艾媒咨詢數據顯示,預計2025年在線餐飲外賣市場規模達到17469億元,生鮮電…

Day05-01-jenkins進階

Day05-01-jenkins進階 10. 案例07: 理解 案例06基于ans實現10.1 整體流程10.2 把shell改為Ansible劇本10.3 jk調用ansible全流程10.4 書寫劇本 11. Jenkins進階11.1 jenkins分布式1)概述2)案例08:拆分docker功能3)創建任務并綁定到…

安裝 ClamAV 并進行病毒掃描

安裝 ClamAV 并進行病毒掃描 以下是安裝 ClamAV 并使用它進行病毒掃描的步驟: 1. 安裝 ClamAV 在 Debian/Ubuntu 系統上: sudo apt update sudo apt install clamav clamav-daemon在 RHEL/CentOS 系統上: sudo yum install epel-release…

開發指南040-swagger加header

swagger可以在線生成接口文檔,便于前后端溝通,而且還可以在線調用接口,方便后臺調試。但是接口需要經過登錄校驗,部分接口還需要得到登錄token,使用token識別用戶身份進行后續操作。這種情況下,都需要接口增…

【刷題筆記(編程題)05】另類加法、走方格的方案數、井字棋、密碼強度等級

1. 另類加法 給定兩個int A和B。編寫一個函數返回AB的值,但不得使用或其他算數運算符。 測試樣例: 1,2 返回:3 示例 1 輸入 輸出 思路1: 二進制0101和1101的相加 0 1 0 1 1 1 0 1 其實就是 不帶進位的結果1000 和進位產生的1010相加 無進位加…

ssm校園志愿服務信息系統-計算機畢業設計源碼97697

摘 要 隨著社會的進步和信息技術的發展,越來越多的學校開始重視志愿服務工作,通過組織各種志愿服務活動,讓學生更好地了解社會、服務社會。然而,在實際操作中,志愿服務的組織和管理面臨著諸多問題,如志愿者…

dledger原理源碼分析系列(一)-架構,核心組件和rpc組件

簡介 dledger是openmessaging的一個組件, raft算法實現,用于分布式日志,本系列分析dledger如何實現raft概念,以及dledger在rocketmq的應用 本系列使用dledger v0.40 本文分析dledger的架構,核心組件;rpc組…

【pytorch16】MLP反向傳播

鏈式法則回顧 多輸出感知機的推導公式回顧 只與w相關的輸出節點和輸入節點有關 多層多輸入感知機 擴展為多層感知機的話,意味著還有一些層(理解為隱藏層σ函數),暫且設置為 x j x_{j} xj?層 對于 x j x_{j} xj?層如果把前面的…

迅捷PDF編輯器合并PDF

迅捷PDF編輯器是一款專業的PDF編輯軟件,不僅支持任意添加文本,而且可以任意編輯PDF原有內容,軟件上方的工具欄中還有豐富的PDF標注、編輯功能,包括高亮、刪除線、下劃線這些基礎的,還有規則或不規則框選、箭頭、便利貼…

【護眼小知識】護眼臺燈真的護眼嗎?防近視臺燈有效果嗎?

當前,近視問題在人群中愈發普遍,據2024年的統計數據顯示,我國兒童青少年的總體近視率已高達52.7%。并且近視背后潛藏著諸多眼部并發癥的風險,例如視網膜脫離、白內障以及開角型青光眼等,嚴重的情況甚至可能引發失明。為…

PMP--知識卡片--波士頓矩陣

文章目錄 記憶黑話概念作用圖示 記憶 一說到波士頓就聯想到波士頓龍蝦,所以波士頓矩陣跟動物有關,狗,牛。 黑話 你公司的現金牛業務,正在逐漸變成瘦狗,應盡快采取收割策略;問題業務的儲備太少&#xff0…

必須掌握的Linux的九大命令

ifconfig 命令用于配置和查看網絡接口的參數。 ping 命令用于測試主機之間的網絡連通性。 telnet用于通過Telnet協議連接到遠程主機。 telnet 127.0.0.1 8000 telnet example.com telnet example.com 8080 iostat 命令用于報告 CPU 統計信息和 I/O 設備負載。 iostat&…

護眼熱點:臺燈護眼是真的嗎?一起來看臺燈的功能作用有哪些

如今近視問題日益嚴峻,尤為引人矚目的是,高度近視學生群體占比已逼近10%的警戒線,且這一比例伴隨著學齡的增長而悄然攀升——從幼兒園6歲孩童中那令人憂慮的1.5%,到高中階段驚人的17.6%,每一組數據都敲響了保護兒童視力…

【Linux】靜態庫的制作和使用詳解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃個人主頁 :阿然成長日記 …

代碼隨想錄算法訓練營第71天:路徑算法[1]

代碼隨想錄算法訓練營第71天:路徑算法 ? bellman_ford之單源有限最短路 卡碼網:96. 城市間貨物運輸 III(opens new window) 【題目描述】 某國為促進城市間經濟交流,決定對貨物運輸提供補貼。共有 n 個編號為 1 到 n 的城市&#xff0c…

【CT】LeetCode手撕—4. 尋找兩個正序數組的中位數

目錄 題目1- 思路2- 實現?4. 尋找兩個正序數組的中位數——題解思路 3- ACM 實現 題目 原題連接:4. 尋找兩個正序數組的中位數 1- 思路 思路 將尋找中位數 ——> 尋找兩個合并數組的第 K 大 (K代表中位數) 實現 ① 遍歷兩個數組 &am…