Java併發基礎知識

来源:https://www.cnblogs.com/WZXwzx/archive/2023/03/11/17206262.html
-Advertisement-
Play Games

原文鏈接:為什麼 Go 語言 struct 要使用 tags 在 Go 語言中,struct 是一種常見的數據類型,它可以用來表示覆雜的數據結構。在 struct 中,我們可以定義多個欄位,每個欄位可以有不同的類型和名稱。 除了這些基本信息之外,Go 還提供了 struct tags,它可以用來指定 ...


進程與線程

進程,程式的一次執行過程,系統運行程式的基本單位。

啟動main函數,即啟動JVM的一個進程,mian函數為其主線程。

同類多個線程共用進程的堆和方法區資源,切換工作負擔比進程小。

一個Java程式的運行時main線程和多個其他線程同時運行。

各個進程是獨立的,但各個線程不一定,同一進程中線程會相互影響,線程執行開銷小,但不利於資源的管理和保護。

線程私有:PC,虛擬機棧,本地方法棧

PC:改變PC讀取指令,實現代碼流程式控制制(位元組碼解釋器);記錄當前線程執行的位置(多線程)

native方法,記錄undefined地址,Java代碼,下一條指令的地址

PC線程私有,便於線程切換後恢復到正確位置

虛擬機棧:Java方法,棧幀在虛擬機棧出入棧

本地方法棧:Native方法,本地方法棧初入棧

保證線程中局部變數不被其他線程訪問

堆和方法去(線程共用):

堆:存放新創建對象;方法區;存放類信息等

多線程好處:

線程切換和調度成本低,減少了上下文切換的開銷;多個同類線程之間的資源競爭較小,任務執行效率提高

多線程帶來的問題:

前文所講,線程執行開銷小,但不利於資源的管理和保護,記憶體泄漏,死鎖,線程不安全(之後可詳細討論)

線程生命周期和狀態:

只有六種,NEW,RUNNABLE,BLOCKED,WAITING,TIME_WAITING,TERMINATED,記憶時可以根據英文名稱記憶

註意區分阻塞狀態和等待狀態。

RUNNABLE狀態中包括運行中與就緒狀態,當就緒狀態的線程獲得時間片後變稱為運行狀態(因時間分片粒度很小,因此不做狀態區分了。

等待狀態的線程需要依靠其他線程的通知才能夠返回運行態,而超時等待的線程超過設置的時間後會自行返回到RUNNABLE狀態;阻塞狀態與鎖有關,鎖也是JAVA併發中的難點重點,後文會提及。

上下文切換:

上下文:線程執行過程中的運行條件和狀態(PC,棧信息等)

線程切換上下文時需保留當前線程的上下文(當線程下次占用CPU時恢復現場),載入下一個將要占用CPU的線程的上下文

保存信息回覆信息會占用CPU和記憶體資源,影響效率

線程死鎖:

多個線程同時被阻塞,等待資源的釋放,且占據著他們持有的資源(資源只能被一個線程占用)不釋放(別的線程無法強行剝奪),形成了一種迴圈等待資源的關係

預防避免線程死鎖:

破壞線程死鎖的條件(一次性申請所有資源,主動釋放占有的資源,按照某一順序申請資源(銀行家演算法))

Java中的鎖和監視器:

一直看到很多關於鎖和監視器的字眼,這次好好瞭解一下。

  • Synchronization is built around an internal entity known as the intrinsic lock or monitor lock. (The API specification often refers to this entity simply as a "monitor.")
  • Every object has an intrinsic lock associated with it. By convention, a thread has to acquire the object's monitor lock before accessing them, and then release the monitor lock when it's done with them. A thread is said to own the lock between the time it has acquired the lock and released the lock. As long as a thread owns a monitor lock, no other thread can acquire the same lock. The other thread will block when it attempts to acquire the lock.
  • When a thread releases the lock, a happens-before relationship is established between that action and any subsequent acquisition of the same lock.

 

翻譯:

同步(synchronized)是圍繞一個內部實體建立的,被稱為內在鎖或監控鎖。(API規範經常把這個實體簡單地稱為 "監視器")。
每個對象都有一個與之相關的內在鎖。按照慣例,一個線程在訪問對象之前必須獲得對象的監控鎖,然後在使用完後釋放監控鎖。一個線程在獲得鎖和釋放鎖這段時間內被稱為擁有該鎖。只要一個線程擁有一個監控鎖,其他線程就不能獲得相同的鎖。當其他線程試圖獲取該鎖時,它將阻塞。
當一個線程釋放鎖的時候,在這個動作和任何後續的相同鎖的獲取之間建立了一個發生在之前的關係。

這是官方文檔裡面的,但還是有些晦澀,我沒太看懂

 


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

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要描述如何解決消息重發的問題,目前主流的消息隊列產品都採用了At least once的服務質量,這就導致了很難避免消息重發的情況,我們可以將消費者業務邏輯設計成冪等服務來解決消息重發問題。 ...
  • 【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現 簡介 橋接模式(Bridge Pattern)是一種結構型設計模式,它將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構,來實現二者的解耦。參與橋接的介面是穩定的,用戶可以擴展和修改橋接中的類,但是不能改變介面。 ...
  • 在Python 中連接MSSQL,MySQL,SQLite,Redis,ElasticSearch,Mongodb,PostgreSQL,Oracle,RabbitMQ 等資料庫/中間件的方式 ...
  • 3、IOC創建對象的方法 使用無參構造創建對象,預設! 使用有參構造創建對象 下標賦值 <!--第一種 下標賦值--> <bean id="user" class="com.jan.pojo.User"> <constructor-arg index="0" value="鐘健"/> </bean> ...
  • 1、Celery的概念 Celery 是一個 基於python開發的分散式非同步消息任務隊列,通過它可以輕鬆的實現任務的非同步處理, 如果你的業務場景中需要用到非同步任務,就可以考慮使用celery, 舉幾個實例場景中可用的例子: 非同步任務:將耗時的操作任務提交給Celery去非同步執行,比如發送簡訊/郵件 ...
  • 一、基本語法元素 1.空白和註釋及語句 (1)空白: 換行符、回車符、空格鍵、水平定位鍵(Tab) 編譯器會忽略掉多餘的空白 作用:增加程式的易讀性 (2)註釋:主要作用是將代碼解釋其功能和作用,在編譯時,編譯器會直接將其丟棄,不會進入執行階段 1)// 在一行內的註釋,此種註釋是同一行內的註釋如果 ...
  • #####需求: 定義一個數組其中包含多個數字。用自己的方式最終實現,奇數放在數組的左邊,偶數放在數組的右邊。(可以創建其他數組,不必須在原數組中改變) 分析: 1.初始化一個數組,裡面既可以存儲奇數也可以存儲偶數(下麵稱這個個數組為原數組)。 2.再次定義兩個數組,一個用來存放從原數組中挑出來的奇 ...
  • VL59 根據RTL圖編寫Verilog程式 這題比較簡單,照著寫就好了。 `timescale 1ns/1ns module RTL( input clk, input rst_n, input data_in, output reg data_out ); reg data_in_reg; al ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...