Java併發小結01

来源:https://www.cnblogs.com/star037/archive/2023/03/14/17214427.html
-Advertisement-
Play Games

事務基礎 事務 事務 是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。 特性 原子性(Atomicity):事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗。 一致性(Consistency):事 ...


Java併發小結01

主要參考自《實戰Java高併發程式設計》。

需要知道的概念

- 同步與非同步
- 併發與並行
- 臨界區
- 阻塞與非阻塞
- 死鎖、饑餓、活鎖
同步與非同步
同步:同步方法一旦被調用,必須等待方法返回後才能繼續後續的行為。
非同步:非同步方法就像一個消息傳遞,被調用後方法會立即返回,調用者可以開始後續的行為。
併發與並行
並行:兩個任務同時執行。
併發:一段時間內,多個任務在CPU交替執行,看似並行。
臨界區
用來表示一種可以被多個線程使用的公共資源,但是一次只能一個線程使用。一旦臨界區被占用,其他線程只能等待。
比如說印表機:一次只能列印一份文件,要是交替列印,那麼列印出來的東西是不可用的。
阻塞與非阻塞
阻塞:一個線程占用了臨界區資源,其他線程需要這個資源就得等待,等待會導致線程掛起,這就是阻塞。
非阻塞:與阻塞相反,沒有一個線程可以導致其他線程阻塞,所有線程都不斷嘗試繼續執行。
死鎖、饑餓、活鎖
死鎖:兩個或兩個以上線程相互請求其他線程的資源,誰都執行不下去。
饑餓:一個線程因為種種原因一直獲取不到需要的資源導致無法執行。
活鎖:線程之間將資源相互推讓而沒有一個線程拿到資源繼續執行。

併發級別

- 阻塞
- 無饑餓
- 無障礙
- 無鎖
- 無等待
阻塞

使用synchronized關鍵字或重入鎖,得到的就是阻塞的線程。

無饑餓

線程預設是不公平的(理論上優先滿足優先順序高的),會導致饑餓,公平鎖解決饑餓問題。

無障礙

無障礙是一種最弱的非阻塞調度。兩個線程如果無障礙地運行,那麼不會因為臨界區的問題導致一方被掛起。如果數據壞了就回滾,沒有數據競爭就順利完成工作,走出臨界區。
無障礙有可能會因為數據衝突一直回滾,一種可行的無障礙實現可以依賴一個“一致性標記”來實現。

無鎖

無鎖的並行都是無障礙的。無鎖的狀態下,所有的線程都能嘗試對臨界區進行訪問,不同的是,無鎖的併發保證必然有一個線程能夠在有限步內完成操作離開臨界區。
會出現線程饑餓。
無鎖的特點:可能會包含一個無窮迴圈。在這個迴圈中,線程會不斷地嘗試修改共用變數。如果沒有衝突,修改成功,走人,否則繼續嘗試。

無等待

無鎖只要求有一個線程在有限步內完成操作,而無等待則在無鎖的基礎上更近一步擴展。它要求所有線程都必須在有限步數內完成,這樣就不會引起饑餓問題。

JMM

探討一下java記憶體模型:原子性、可見性、有序性。

原子性:

一個操作是不可中斷的。

可見性

一個線程修改了某個共用變數的值時,其他線程會立馬知道這個修改。

有序性

程式在執行時,可能就進行指令排序,排序後的指令順序與原指令順序未必一致。
但是指令排序可以保證串列語義一致,不保證並行語義一致。

那些指令不能排序:Happen-Before原則
  • 程式順序原則:一個線程內保證語義的串列性。

  • volatile 原則:volatile變數的寫先於讀發生,這保證了volatile變數的可見性。

  • 鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前面。

  • 傳遞性:A先於B,B先於C,那麼A先於C。

  • 線程的start()方法先於它的每一個動作。

  • 線程的中斷(interrupt)先於被中斷線程的代碼。

  • 對象的構造函數的執行、結束先於finalize()方法。

個人小結:

這些都是概念性問題,如果第一次不太熟悉可以baidu一下進行理解。

作為《實戰Java高併發程式設計》的一章,主要介紹了併發的一些概念性關鍵詞,建議深入理解,後面的多線程併發操作都建立在這些概念之上。

其中第一章有一個小結介紹有關並行的兩個定律我忽略了,感興趣的可以自己去看: Amdahl定律和Gustafson定律。


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

-Advertisement-
Play Games
更多相關文章
  • 前言 🍊緣由 經常看到網上很多優秀的開源項目中,代碼簡潔,模塊分層完美。反觀自己代碼層級混亂,,卻不知如何整理分層。此文手把手教你一步一步創建模塊,左手右手一個慢動作。結合本人實際開發及個人項目中分層思路的分享,大神請勿噴。 ⏲️本文閱讀時長 約25分鐘 🎯主要目標 熟練掌握SpringBoot ...
  • MyBatis 1、簡介 1.1 什麼是Mybatis MyBatis 是一款優秀的持久層框架; 它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 J ...
  • 版權聲明:原創不易,本文禁止抄襲、轉載,侵權必究! 一、去吧!皮卡丘! 使用turtle(海龜庫)製作而成,感覺挺好玩的,哈哈@>_<@,效果如下: 由於源碼過長,這裡僅展示部分代碼: from turtle import * import turtle as t from random impor ...
  • 在做項目的時候,安裝MybatisX插件可以讓我們不用寫實體類,加快我們的開發速度,讓我們更專註於業務邏輯的開發,可是最近在做項目的時候,發現MybatisX插件的MybatisX-Generator無法生成實體類,但是其它的文件都可以自動生成。 原因:idea的版本(本人電腦idea版本是2021 ...
  • 引言 大家好,我是蠟筆小曦。 我們在通過程式向某個網頁發起請求時,實際上是模擬瀏覽器進行http(超文本傳輸協議)請求,這就要求我們需要按照固定的格式進行代碼構造。 一般請求數據分為三部分:請求行、請求頭、請求體,如果每次都手動進行這些內容的構造,無疑會花費大量的時間,準確性也難以保證。 現在就給大 ...
  • python語言基礎 1.1 python語法特點 1.1.1 註釋規則 什麼是註釋? 所謂註釋,就是在代碼中添加標註性的文字,進而更好的幫助我們更好的閱讀代碼,註釋又分為單行註釋和多行註釋。 1. 單行註釋 1 單行註釋用: # 來註釋 2 例: 3 print("hello word! ") # ...
  • 一、進位數的表示 十進位——直接表示:10二進位——(首碼):0B1010八進位——(首碼):0O12十六進位——(首碼):0XA 二、進位轉換 (1)十進位轉其他 十進位轉二進位: bin(10)十進位轉八進位: oct(10)十進位轉十六進位:hex(10) 備註:註意以上輸出類型均為字元串,另 ...
  • 飢漢模式 package com.cz.single; /** * @author 卓亦葦 * @version 1.0 * 2023/3/11 21:31 */ public class Hungry { private byte[] data1 = new byte[1024]; private ...
一周排行
    -Advertisement-
    Play Games
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...