JVM-默背版

1.JVM對sychronized的優化:鎖膨脹、鎖消除、鎖粗化、自適應自旋鎖
(1)鎖膨脹:從無鎖、偏向鎖、輕量級鎖、重量級鎖的過程叫做鎖膨脹。在JDK1.6以前,sychronized是由重量級鎖實現的,加鎖和解鎖的過程需要從用戶態切換到內核態,性能低下。有了鎖膨脹機制,大多數場景可以使用無鎖、偏向鎖和輕量級鎖,在執行并發操作的時候,避免了線程從用戶態到內核態,從而減少性能的開銷。
(2)鎖消除:JVM檢測到代碼段不再被共享和競爭,此時就會取消該代碼段的所屬的代碼段。
(3)鎖粗化:將多個連續的加鎖、解鎖操作鏈接在一起,形成一個范圍更大的鎖。
(4)自適應自旋鎖:通過自身循環,獲取鎖的一種方式,避免了線程開啟和線程掛起的性能開銷。因為線程開啟和線程掛起需要從用戶態轉到內核態,這個過程是比較緩慢的,性能比較低下。
2.介紹AQS
3.CAS和AQS的關系
4.用AQS實現可重入的公平鎖
5.ThreadLocal的作用
6.樂觀鎖和悲觀鎖
7.java中實現樂觀鎖的方式
8.CAS的缺點
9.為什么不能所有的鎖都用CAS
10.CAS有什么問題,java是如何解決的

11.volatile的作用
volatile可以保證可見性,不能保證原子性,所以會引發線程安全的問題。如果一個線程修改了使用volatile關鍵字的修飾的變量,其他線程也能獲取到這個變量的最新值,從而避免了數據不一致的狀態。
對于復合操作,比如i++這種自增操作,因為不是原子操作,如果有多個線程修改了i的值,volatile是不能保證線程安全的。需要用Sychronized和Lock來保證原子性和線程安全。

12.volatile和sychronized的比較

13.什么是公平鎖和非公平鎖。

14.非公平鎖的吞吐量為什么比公平鎖大。
15.reentrantlock是怎么實現公平鎖的。
公平鎖和非公平鎖的區別是,公平鎖中有hasQueueProcessors()=false方法,來看自己之前還有線程在排隊嗎
hasQueuedPredecessors() 用來判斷 當前等待隊列是否有線程在排隊獲取鎖。對于非公平鎖,無論是否已經有線程在排隊,都會嘗試獲取鎖,獲取不到再排隊。
tryLock()方法是非公平的,可以插隊
16.線程池的核心參數
new SynchronousQueue<>() 是 Java 并發包 里的一個用法。SynchronousQueue 是 java.util.concurrent 提供的一種特殊的 阻塞隊列。

和普通的隊列(ArrayBlockingQueue、LinkedBlockingQueue)不同:它不存儲任何元素,容量是 0。

每次 put() 必須等到有另一個線程 take(),才能成功;反過來 take() 也必須等到有人 put()。

所以它其實是一個 線程之間直接移交(handoff)數據的工具。
把 SynchronousQueue 想象成 過手交易:

線程 A 想交給線程 B 一個包裹。

A 必須等到 B 伸手來拿(調用 take()),才能把東西放出去。

它不像普通隊列能“先存進去,等別人慢慢取”。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
17.await()方法
(1)Condition.await()
在 java.util.concurrent.locks.Condition 接口中,await() 是用來 讓當前線程等待,直到其他線程通過 signal() 或 signalAll() 喚醒它。常用場景是自定義鎖下的線程等待/通知機制。

import java.util.concurrent.locks.*;public class AwaitExample {private static final Lock lock = new ReentrantLock();private static final Condition condition = lock.newCondition();public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {lock.lock();try {System.out.println("Thread t1: Waiting...");condition.await(); // 等待被喚醒System.out.println("Thread t1: Woke up!");} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}});Thread t2 = new Thread(() -> {lock.lock();try {System.out.println("Thread t2: Sleeping for 2s...");Thread.sleep(2000);condition.signal(); // 喚醒等待的線程System.out.println("Thread t2: Sent signal!");} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}});t1.start();t2.start();t1.join();t2.join();}
}

await() 會釋放鎖并讓當前線程等待。

signal() 或 signalAll() 會喚醒等待線程。

與 Object.wait() 類似,但更靈活,可以在 Lock 中使用。
(2)CountDownLatch.await()
在 java.util.concurrent.CountDownLatch 中,await() 是 阻塞當前線程,直到計數器為 0。

CountDownLatch latch = new CountDownLatch(3);for (int i = 0; i < 3; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + " finished work");latch.countDown(); // 計數器減 1}).start();
}latch.await(); // 阻塞,直到計數器為 0
System.out.println("All threads finished!");

(3)CompletableFuture.await()(類似概念) 不常用
在 異步編程里,比如在某些庫或 Kotlin/JavaScript 的 async/await 中,await 用來 等待異步操作完成并獲取結果。Java 標準庫里 CompletableFuture 沒有 await() 方法,但可以用 get() 或 join() 實現類似效果。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
String result = future.join(); // 等待結果
System.out.println(result); // 輸出 "Hello"

18.例子3

join() → 一直等,直到目標線程結束。
前面例子里寫的 t1.join(); t2.join(); 的意思就是:
主線程會先等待 t1 執行結束,再等待 t2 執行結束,最后才繼續往下走。這樣可以確保兩個子線程都跑完。
假設兩個線程并發讀寫同一個整型變量,初始值為零,每個線程加 50次,結果可能是什么?
在沒有任何同步機制的情況下,兩個線程并發對同一個整型變量進行 50 次加1操作,最終結果可能是100,也可能小于 100,最壞的結果是 50,也就是最終的結果可能是在 [50,100]。
小于 100 情況的分析,由于對整型變量的 num++ 操作不是原子操作,它實際上包含了三個步驟:讀取變量的值、將值加 1、將新值寫回變量。在多線程環境下,可能會出現線程安全問題。例如,線程1和線程2同時讀取了變量的當前值,然后各自將其加 1,最后都將相同的新值寫回變量,這就導致了一次加 1操作的丟失。這種情況會多次發生,最終結果就會小于 100。

import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerAddition {private static AtomicInteger num = new AtomicInteger(0);public static void main(String[] args) throws InterruptedException{Thread thread1 = new Thread(()->{for(int i=0;i<50;i++){num.incrementAndGet();}});Thread thread2 = new Thread(()-> {for(int i=0;i<50;i++){num.incrementAndGet();}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("最終結果:"+ num.get());}}

通過sychronized方法,保證操作的互斥性。

public class SynchronizedAddition {private static int num =0;private static final Object lock = new Object();public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(()-> {for(int i=0;i<50;i++){synchronized(lock){num++;}}});Thread thread2 = new Thread(()-> {for (int i = 0; i < 50; i++) {synchronized (lock) {num++;}}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("最終結果:"+ num);}}

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

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

相關文章

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一鍵安裝)

在 Mac M 系列芯片&#xff08;Apple Silicon/ARM 架構&#xff09;上部署 YOLOv8&#xff0c;有一些注意事項&#xff1a;PyTorch 需要安裝 ARM 原生版本&#xff0c;推理可利用 Metal 后端加速 CPU。本文教你一步步完成環境配置、模型下載、依賴安裝和驗證推理。1?? 環境準…

Python爬蟲實戰:研究Units模塊,構建氣象數據采集和分析系統

1. 引言 1.1 研究背景 隨著信息技術的飛速發展,互聯網已成為全球最大的信息庫,涵蓋氣象、金融、醫療、農業等多個領域的海量數據。這些數據蘊含著巨大的潛在價值,如何有效獲取并深入分析這些數據成為當下研究的熱點。Python 作為一種功能強大的編程語言,憑借其豐富的庫資…

網頁設計模板 HTML源碼網站模板下載

互聯網已成為現代社會不可或缺的一部分&#xff0c;網站則是連接線上與線下世界的橋梁。無論是用于展示個人作品集、推廣商業產品還是提供公共服務信息&#xff0c;一個設計精良且功能完善的網站都能發揮巨大作用。然而&#xff0c;傳統的手工編碼方式不僅耗時費力&#xff0c;…

Flink KeyedProcessFunction為什么能為每個key定義State和Timer?

問題描述 一個常見的開窗邏輯&#xff08;12H 或者 500條&#xff09;&#xff1a; import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初階---函數模版、類模版

&#x1f31f;個人主頁&#xff1a;第七序章 &#x1f308;專欄系列&#xff1a;C&#xff0b;&#xff0b; 目錄 ??前言&#xff1a; &#x1f308;1.泛型編程&#xff1a; &#x1f308;2.函數模板 &#x1f36d;2.1函數模板概念 &#x1f36d;2.2函數模板格式 &am…

查找算法(Java)

目錄 一.定義 二.分類 三.線性查找 原理&#xff1a; 思路分析 代碼實現 例題實踐 1.兩數之和 方法一&#xff1a;暴力窮舉法 思路分析 代碼實現 方法二&#xff1a;創建哈希表 思路分析 代碼實現 2.移動零 思路分析 代碼實現 四.二分查找 原理&#xff1a; …

計算機網絡--四層模型,IP地址和MAC地址

四層模型&#xff1a;分別是應用層&#xff0c;傳輸層&#xff0c;網絡層和鏈路層。應用層&#xff1a;提供了應用程序之間相互通信的接口&#xff0c;允許用戶訪問網絡服務。這一層定義了應用程序如何與底層網絡進行交互。例如HTTP協議。傳輸層&#xff1a;它處理數據的分段、…

解析、創建Excel文件的開源庫OpenXLSX介紹

OpenXLSX是一個C庫&#xff0c;用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源碼地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License為BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 &#xff08;缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字&#xff08;出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

構建Python環境的幾種工具

本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊&#xff0c;無需額外安裝。 ②virtualenv:venv的前身&#xff0c;功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

c#項目編譯時外部依賴文件的同步問題

很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件&#xff0c;需要編譯時同步到bin\debug或bin\release下的&#xff0c;這里面要修改工程文件代碼實現。 比如&#xff0c;我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面&#xff0c;希望編譯的時候…

數學建模常用算法-模擬退火算法

一、模擬退火算法模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后&#xff0c;緩慢冷卻&#xff0c;金屬原子會在熱能作用下自由運動&#xff0c;逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型&#xff1a;“溫度 T”&#xff1a;對應物理中的…

架構很簡單:業務架構圖

緣起業務架構是一個復雜的體系&#xff0c;如何更簡單的表達&#xff0c;并能使用起來呢&#xff1f;所謂&#xff1a;大道至簡。基于此&#xff0c;這篇文章就開始了。業務是一切架構的開始&#xff0c;如果沒有業務&#xff0c;架構又有什么作用呢&#xff1f;所以做架構首先…

【前端埋點】純前端實現 A/B Test

“純前端實現 A/B Test”&#xff0c;意思就是 沒有后端分流、也不依賴流量網關&#xff0c;那么只能靠前端邏輯來做“流量切分”。 &#x1f3af; 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致&#xff08;否則用戶刷新頁面時 A/B 會跳…

Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法&#xff0c;核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器&#xff0c;正確的數據權重減小&#xff0c;錯誤的數據權重增加二…

C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

C#語言入門詳解&#xff08;18&#xff09;傳值、輸出、引用、數組、具名、可選參數、擴展方法一、傳值參數1. 值類型2. 引用類型&#xff0c;并且創建對象3. 引用類型&#xff0c;不創建對象二、引用參數1. 值類型2. 引用類型&#xff0c;創建新對象3. 引用類型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…

圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

簡介判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一&#xff0c;包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題&#xff0c;以及在實際應用…

react的filber架構

好問題 &#x1f44d; 你問的是 React Fiber 架構。這是 React 16 引入的核心機制&#xff0c;用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…