深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版)第十三章知識點問答(15題)

預告下一本 可能是mysql8+的書籍 或者是AI應用工程的基本崗位所有技能

問題1

什么是 線程安全?在 Java 中如何定義“線程安全”?


線程安全(Thread Safety) 的定義是:

  • 當多個線程同時訪問某個類的對象時,無論運行環境如何調度這些線程、無論這些線程如何交替執行,并且在主調代碼中不需要任何額外的同步或協調操作,這個類都能表現出正確的行為。

Java 中,線程安全意味著:

  • 對外暴露的方法調用都是 原子性 的。
  • 并發訪問時不會導致 數據不一致狀態破壞異常行為
  • 典型例子:java.util.VectorHashtableConcurrentHashMap 等線程安全類。

👉 換句話說:線程安全的本質 = 行為一致性,不隨并發環境變化而變化。


問題2

作者將“線程安全”劃分為不同的 粒度層次。請問有哪些分類?并簡要說明它們的區別。
你提到的“無鎖、偏向鎖、輕量級鎖、重量級鎖” 👍,這其實是 JVM 在實現 synchronized 時的鎖狀態劃分和優化路徑(屬于 鎖優化 的部分)。


線程安全的分類(語義層次)

作者把“線程安全”從強到弱分為以下幾類:

  1. 不可變(Immutable)

    • 對象一旦創建,其狀態就不會改變。
    • 典型例子:StringIntegerLong 等包裝類。
    • 天然線程安全。
  2. 絕對線程安全

    • 滿足嚴格定義:類在 任意調用場景下 都是線程安全的。
    • 需要在所有方法調用上都進行同步。
    • 代價極高,Java 標準庫幾乎沒有完全絕對線程安全的類。
  3. 相對線程安全(常見的“線程安全”定義)

    • Java 大多數線程安全類遵循這一標準。
    • 在特定條件下能保證正確行為,比如 VectorHashtableCollections.synchronizedXXX()
    • 通常指 單個方法是原子安全的,但復合調用(如“先檢查再更新”)仍需額外同步。
  4. 線程兼容(Thread-Compatible)

    • 類本身不是線程安全的,但只要 調用方在外部進行正確同步,就能在多線程環境中安全使用。
    • 典型例子:ArrayListHashMap
  5. 線程對立(Thread-Hostile)

    • 類在并發環境下完全無法使用,即使調用方進行外部同步也無濟于事。
    • 很少見,多出現在不規范的第三方代碼中。

問題3

互斥同步(Mutual Exclusion Synchronization)的基本原理是什么?在 Java 中有哪些典型實現?


  1. 基本原理

    • 互斥同步的核心是:同一時刻只允許一個線程進入臨界區,訪問共享資源。
    • 實現方式通常是:當一個線程獲取鎖標記后,其他線程必須 阻塞,直到鎖被釋放。
    • 這種同步機制保證了 互斥性(Mutual Exclusion),從而避免數據競爭。
  2. 在 Java 中的典型實現

    • synchronized

      • Java 內置關鍵字,編譯后會生成 monitorenter / monitorexit 字節碼指令。
      • 由 JVM 保證 原子性、可見性、有序性
    • ReentrantLock(顯示鎖)

      • 位于 java.util.concurrent.locks 包。
      • 功能更豐富,比如可定時嘗試獲取鎖、公平/非公平策略、支持條件變量。
    • 其它并發工具

      • Semaphore(信號量)、CountDownLatchCyclicBarrier 等,也都基于“互斥/同步”思想。
  3. 特點

    • 優點:實現簡單,語義清晰,保證嚴格的互斥訪問。
    • 缺點:可能導致線程 阻塞/喚醒切換開銷大,在高并發場景下性能不理想。

👉 總結:
互斥同步的本質是 “搶占標記 → 獨占訪問 → 釋放標記”,在 Java 中主要通過 synchronizedLock 系列實現。


好的 👍,那我繼續自動拋出下一題。


問題4

非阻塞同步(基于 CAS)的基本原理是什么?它的優點和缺點是什么?


  1. 基本原理

    • CAS(Compare-And-Swap)是一種 非阻塞同步機制。

    • 操作過程:

      1. 比較內存中的值是否與預期值一致;
      2. 如果一致,就更新為新值;
      3. 如果不一致,說明有競爭,操作失敗,通常會 自旋重試
    • 整個過程由 CPU 提供的原子指令保證,不會出現“更新一半被打斷”。

  2. 優點

    • 無阻塞:線程不會因為獲取鎖失敗而掛起,而是立即返回/重試。
    • 高性能:在競爭不激烈時,性能遠優于鎖(避免上下文切換)。
    • 原子性保證:由硬件指令直接支持。
  3. 缺點

    • ABA 問題:值從 A 改為 B,再改回 A,CAS 會誤認為值沒變。

      • 解決方法:加版本號(如 AtomicStampedReference)。
    • 自旋開銷大:在高并發或競爭激烈時,CAS 可能長時間重試,反而比鎖更耗性能。

    • 只能保證單個變量的原子性:要實現復合操作(如多個共享變量的一致更新)需要額外機制。

👉 總結:
CAS 屬于 樂觀并發控制,適合“讀多寫少、競爭不激烈”的場景。它是 Java 并發包(AtomicIntegerConcurrentHashMap)等的核心實現手段。


問題5

無同步方案 通常適用于哪類場景?請舉例說明。


無同步方案 的核心思想是:

  • 當多個線程之間 不存在共享數據,或即使存在也 不需要嚴格同步 時,可以完全不使用任何同步手段。

典型適用場景:

  1. 可重入代碼(Reentrant Code)

    • 又叫純代碼(Pure Code),方法內部沒有引用任何共享數據,輸出只依賴輸入參數。
    • 例如數學函數:Math.sin()Math.sqrt()
  2. 線程本地存儲(Thread Local Storage)

    • 每個線程維護獨立的副本,互不影響。
    • Java 提供了 ThreadLocal 工具類。
  3. 局部變量

    • 定義在方法體中的局部變量存放在棧幀上,每個線程有獨立的棧,天然線程安全。
  4. 只讀共享數據

    • 數據在初始化后不再改變,多個線程只讀而不寫。
    • 比如配置常量、不可變對象(StringInteger)。

👉 總結:
無同步方案適合 數據不會競爭 的情況,它讓代碼更高效,避免了不必要的鎖和 CAS 開銷。


問題6

Java 內置的哪些關鍵字和工具可以用來保證線程安全?請至少列出三種,并簡要說明作用。


  1. synchronized:內置監視器鎖,提供互斥 + 可見性 + 有序性(編譯為 monitorenter/monitorexit)。
  2. volatile:提供可見性和禁止重排序(不保證復合操作原子性)。
  3. java.util.concurrent.locks.Lock / ReentrantLock:顯式鎖,支持可中斷/可定時/公平鎖、條件變量等高級特性。
  4. 原子類(AtomicInteger 等):基于 CAS 的非阻塞同步,保證單變量原子更新。
  5. 并發容器ConcurrentHashMapConcurrentLinkedQueue 等,封裝了內部同步/無鎖算法。
  6. 同步器SemaphoreCountDownLatchCyclicBarrierPhaserExchanger(多樣化協作/限流)。
  7. 讀寫鎖 / 票據鎖ReadWriteLockStampedLock(樂觀/悲觀讀、寫)。
  8. ThreadLocal:線程本地存儲,繞過共享從而“無同步”。
  9. final(發布語義):構造期的寫入有特殊的安全發布語義(配合 JMM)。

問題7

synchronized 的基本語義是什么?它在字節碼層面如何體現?(提示:兩個字節碼指令;保證哪三種內存語義?)


  1. 基本語義

    • synchronized 是 Java 內置的同步機制,具有 互斥性(排他性):同一時間只能有一個線程進入同步塊。

    • 內存語義上,它保證:

      • 原子性:同步塊內的操作不可被其他線程打斷。
      • 可見性:進入同步塊前會清空工作內存,從主內存加載最新值;退出時會把更新刷新到主內存。
      • 有序性:加鎖與解鎖之間的代碼不會被重排序。
  2. 字節碼層面實現

    • synchronized 在編譯后會在同步代碼塊前后插入兩條字節碼指令:

      • monitorenter:獲取對象的監視器鎖。
      • monitorexit:釋放監視器鎖。
    • JVM 在執行這些指令時,會觸發鎖優化機制(偏向鎖 → 輕量級鎖 → 重量級鎖)。

  3. JVM 層面的優化

    • 現代 HotSpot 會對 synchronized 做優化:偏向鎖、輕量級鎖、自旋鎖、鎖粗化、鎖消除等。
    • 在底層實現上,確實會用到 CPU 的 LOCK 前綴指令 + 內存屏障,保證硬件層面的可見性與順序性。

👉 總結:

  • 語義:互斥 + 原子性 + 可見性 + 有序性。
  • 字節碼monitorenter / monitorexit
  • 底層:依賴 CPU 原子指令和內存屏障。

問題8

ReentrantLock 與 synchronized 相比,有哪些額外特性?


ReentrantLock 與 synchronized 的區別/額外特性:

  1. 相同點

    • 都是 可重入鎖:同一個線程可以多次獲取同一把鎖,不會死鎖。
  2. ReentrantLock 的額外特性:

    • 可中斷鎖:可以調用 lockInterruptibly(),在等待鎖時能響應中斷。
    • 可定時鎖:調用 tryLock(long time, TimeUnit unit),在超時后自動放棄等待。
    • 公平鎖 / 非公平鎖:可以指定是否采用 FIFO 獲取鎖,避免線程“餓死”。
    • 多個條件變量:通過 newCondition() 可以為不同等待隊列設置不同的喚醒條件,比 synchronized 的 wait/notify 更靈活。
    • 顯式獲取/釋放:必須手動調用 lock()unlock(),更靈活,但也更容易出錯。
  3. synchronized 的特點:

    • JVM 內置支持,語法層面保證,簡單易用。
    • 自動釋放鎖(代碼塊退出時自動解鎖,不易忘記)。
    • 鎖優化:偏向鎖、輕量級鎖、自旋鎖、重量級鎖,升級路徑透明給開發者。

👉 總結:

  • synchronized:簡單、語法級,自動釋放鎖。
  • ReentrantLock:功能更強大,可中斷、可定時、公平鎖、多條件隊列,更靈活,但需手動釋放鎖。

問題9

什么是 自旋鎖(Spin Lock)?它解決了什么問題?


  1. 自旋鎖的定義

    • 當線程嘗試獲取鎖失敗時,不是立即進入阻塞狀態,而是在 用戶態循環等待(自旋),不斷重試是否能獲取鎖。
    • 如果在一定次數/時間內仍然失敗,就會 升級為重量級鎖(阻塞/排隊)。
  2. 它解決的問題

    • 傳統阻塞鎖(重量級鎖)一旦獲取失敗,就會進入 內核態阻塞,喚醒時需要 用戶態 ? 內核態切換,開銷大。
    • 如果鎖 只會短暫被持有,那么切換上下文的成本甚至比等鎖的時間還高。
    • 自旋鎖通過“原地等待”,避免了短時間內的上下文切換開銷。
  3. 特點

    • 優點:適合 鎖占用時間非常短 的場景(比如幾十納秒到幾微秒)。
    • 缺點:會浪費 CPU,如果自旋時間過長,會導致性能下降。
    • HotSpot 的改進:引入 適應性自旋(Adaptive Spinning),根據線程狀態和歷史鎖競爭情況動態決定是否自旋。

👉 總結:
自旋鎖 = 用 CPU 忙等換取避免阻塞/喚醒的開銷,是 synchronized 鎖優化的一部分。


問題10

什么是 鎖消除(Lock Elimination)?它的原理是什么?


  1. 定義

    • 鎖消除(Lock Elimination)是 即時編譯器(JIT) 在運行時的一項優化。
    • 如果代碼中出現了同步塊,但經過 逃逸分析 發現,這些對象不會被多個線程共享,也就不存在競爭,那么這些同步操作會被直接消除。
  2. 原理

    • 逃逸分析用于判斷對象是否會逃出方法/線程。
    • 若對象完全不會逃出線程作用域(即線程私有),那么它上的鎖就是無意義的,可以直接去掉。
  3. 示例

    public String concat(String s1, String s2) {StringBuffer sb = new StringBuffer();sb.append(s1);sb.append(s2);return sb.toString();
    }
    
    • StringBuffer 的方法帶有 synchronized,但這里 sb 是局部變量,絕對不會被多線程共享。
    • JIT 會 鎖消除,直接去掉 synchronized,提升性能。
  4. 效果

    • 減少無用的加鎖/解鎖操作。
    • 提升性能,尤其在高頻調用場景中。

👉 總結:
鎖消除 = 通過逃逸分析發現“無競爭鎖” → 刪除無意義的同步


問題11

什么是 鎖粗化(Lock Coarsening)?它解決了什么問題?


  1. 定義

    • 鎖粗化(Lock Coarsening) 是 JVM 的一種優化。
    • 如果 JIT 發現一系列 連續的加鎖/解鎖操作作用在同一個對象上,就會把這些零碎的鎖合并成一個更大范圍的鎖。
  2. 為什么需要?

    • 按照常規推薦,鎖粒度應盡量小,以減少鎖持有時間。
    • 但如果多個同步塊連續執行,每次都要 頻繁加鎖/解鎖,反而帶來額外開銷。
    • 這種情況下,粗化鎖的范圍可以減少反復申請和釋放鎖的成本。
  3. 示例

    for (int i = 0; i < 100; i++) {synchronized (obj) {// 只有很小的操作sum++;}
    }
    
    • 常規寫法是 100 次加鎖/解鎖。
    • JIT 會將這 100 次鎖 粗化為一次大的加鎖/解鎖,把整個循環都包進一個鎖中。
  4. 效果

    • 減少頻繁加鎖/解鎖的性能損耗。
    • 犧牲部分并發性(鎖范圍變大),換取整體性能提升。

👉 總結:

  • 常規建議:同步塊要小,減少持有時間。
  • 鎖粗化:當多次鎖操作緊鄰時,JIT 會合并它們,減少頻繁申請/釋放鎖的成本。

問題12

偏向鎖、輕量級鎖、重量級鎖三者的區別是什么?它們的 升級路徑 是怎樣的?


HotSpot JVM 中,synchronized 的鎖實現有三種形態:

  1. 偏向鎖(Biased Locking)

    • 設計目的:優化 無競爭的場景

    • 特點:

      • 第一次獲得鎖的線程會在對象頭記錄“偏向線程 ID”。
      • 之后該線程再次進入同步塊時,直接判斷對象頭,無需真正加鎖。
      • 幾乎 零開銷,所以可以看作“鎖=沒鎖”。
    • 觸發升級:當 第二個線程嘗試獲取鎖,發現已有偏向線程 ID,就會撤銷偏向,升級為輕量級鎖。

  2. 輕量級鎖(Lightweight Locking)

    • 設計目的:優化 低競爭場景

    • 特點:

      • 通過 CAS 操作嘗試在對象頭設置鎖記錄。
      • 如果成功,線程進入臨界區。
      • 如果 CAS 失敗,表示有競爭 → 線程會 自旋 等待持有鎖的線程釋放。
    • 優點:避免了線程阻塞/喚醒的高開銷。

    • 缺點:自旋消耗 CPU。

    • 觸發升級:如果競爭嚴重,自旋失敗,鎖會膨脹為重量級鎖。

  3. 重量級鎖(Heavyweight Locking)

    • 設計目的:處理 高競爭場景

    • 特點:

      • 線程獲取不到鎖時會進入 阻塞狀態(操作系統層面),等待喚醒。
      • 保證安全性,但有 內核態/用戶態切換 的高開銷。
    • 適合鎖競爭非常激烈的場景。


升級路徑

偏向鎖 → 輕量級鎖 → 重量級鎖

  • 鎖只能 升級,不會降級
  • 這是為了避免鎖頻繁轉換帶來的復雜性和額外開銷。

👉 總結:

  • 偏向鎖:無競爭優化,幾乎零成本。
  • 輕量級鎖:低競爭優化,CAS + 自旋。
  • 重量級鎖:高競爭場景,阻塞/喚醒。
  • 升級路徑:偏向 → 輕量級 → 重量級(不可逆)。

下一題(問題13)

什么是 適應性自旋(Adaptive Spinning)?它相比固定自旋有什么優勢?


  1. 自旋的背景

    • 輕量級鎖獲取失敗時,線程不會馬上阻塞,而是進入 自旋(忙等)狀態,嘗試再次獲取鎖。
    • 固定自旋:早期 JVM 使用固定次數(例如 10 次)循環嘗試獲取鎖。
  2. 適應性自旋(Adaptive Spinning)

    • 自旋次數 不再固定,而是由 JVM 根據運行時情況動態調整。

    • 例如:

      • 如果某個鎖的持有線程 剛剛釋放過鎖,說明鎖等待時間可能短,可以多自旋幾次。
      • 如果某個線程在之前的自旋中 幾乎沒成功過,則減少或放棄自旋,直接阻塞。
  3. 優勢

    • 節省開銷:避免無意義的長時間自旋,降低 CPU 消耗。
    • 提升性能:在鎖競爭較輕時,減少線程掛起/喚醒的切換開銷。
    • 更智能:自旋次數動態適配應用場景,而不是一刀切。

👉 總結:
適應性自旋 = JVM 根據歷史成功經驗和鎖的持有情況,動態調整自旋時間。
優點:比固定自旋更智能,能在輕度競爭時提升性能,在重度競爭時減少 CPU 浪費。


問題14

鎖優化技術的總體目標是什么?為什么說它們的核心思想是“減少獲得鎖的代價”?


  1. 總體目標

    • 鎖優化技術的根本目標是:

      • 減少獲取和釋放鎖的性能開銷,提高程序在并發情況下的吞吐量。
    • 換句話說:讓 synchronized 這種看似“重量級”的操作,在大多數場景下跑得輕快。

  2. 為什么要減少代價?

    • 傳統重量級鎖:競爭失敗就會觸發線程阻塞/喚醒,需要內核態和用戶態切換 → 開銷大。
    • 優化手段:通過自旋、偏向鎖、輕量級鎖、鎖消除、鎖粗化等方式,盡量避免線程進入阻塞狀態。
  3. 核心思想

    • 減少上下文切換(用戶態 ? 內核態)。
    • 避免不必要的同步(鎖消除)。
    • 合并分散鎖操作(鎖粗化)。
    • 利用無競爭場景優化(偏向鎖)。
    • 低競爭場景用忙等代替阻塞(輕量級鎖 + 自旋)。

👉 總結:
鎖優化的核心思想 = 減少獲得鎖的代價,即讓鎖盡量避免走到“重量級”阻塞/喚醒的路徑,而是通過各種手段(偏向、輕量、自旋、消除、粗化)在用戶態內完成,大幅降低 CPU 和線程調度的開銷。


問題15

請總結 第 13 章《線程安全與鎖優化》 的主要知識點:

  • 線程安全的定義與分類
  • 互斥同步 / 非阻塞同步 / 無同步方案
  • Java 提供的關鍵工具
  • JVM 的鎖優化技術(自旋、適應性自旋、鎖消除、鎖粗化、偏向鎖、輕量級鎖、重量級鎖)

按照保證程度,線程安全可以分為:

  • 不可變(Immutable):如 String,天生線程安全;
  • 絕對線程安全:完全符合嚴格定義,但開銷極大;
  • 相對線程安全:常見,保證單次方法調用安全,如 Vector
  • 線程兼容:類本身非線程安全,需要調用方加同步,如 ArrayList
  • 線程對立:不管怎樣都無法在并發場景中正確使用。

實現線程安全的手段主要有三類:

  1. 互斥同步:最傳統的方法,通過鎖來保證臨界區互斥訪問,典型實現是 synchronizedReentrantLock
  2. 非阻塞同步:通過 CAS 等硬件原子指令完成更新,失敗時自旋重試,避免線程阻塞。
  3. 無同步方案:在沒有共享數據或無需同步時,直接避免鎖,比如局部變量、ThreadLocal、不可變對象。

Java 提供了多種工具來實現線程安全,包括:

  • 關鍵字:synchronizedvolatilefinal(安全發布語義);
  • 并發包:LockAtomic 原子類、并發容器(ConcurrentHashMap)、同步器(SemaphoreCountDownLatch);
  • ThreadLocal 等無同步手段。

在 JVM 內部,HotSpot 對鎖做了多種優化以減少性能開銷:

  • 自旋鎖:在短時間內忙等而不阻塞,避免上下文切換。
  • 適應性自旋:根據歷史和環境動態調整自旋次數。
  • 鎖消除:利用逃逸分析去掉無意義的同步。
  • 鎖粗化:合并多個連續的加鎖/解鎖操作。
  • 偏向鎖:優化無競爭場景,幾乎零成本。
  • 輕量級鎖:適合低競爭場景,基于 CAS + 自旋。
  • 重量級鎖:高競爭場景下的最終方案,線程阻塞/喚醒。

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

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

相關文章

【醫療 AI】Baichuan-M2:大語言模型在醫療領域的動態驗證框架

Baichuan-M2 醫療大模型&#xff1a;技術解讀與使用方法 Baichuan-M2&#xff1a;大語言模型在醫療領域的動態驗證框架 【醫療 AI】Baichuan-M2&#xff1a;大語言模型在醫療領域的動態驗證框架0. Baichuan-M2 模型簡介0.1 基本信息0.2 主要貢獻0.3 論文摘要1. 引言2. 驗證系統…

Ubuntu\Linux環境中驅動版本配置cudaToolKit

修改環境變量。 1. 首先檢查當前的環境變量 # 查看當前PATH echo $PATH# 查看當前LD_LIBRARY_PATH echo $LD_LIBRARY_PATH# 查看當前CUDA_HOME echo $CUDA_HOME2. 確定正確的CUDA安裝路徑 # 查看系統中有哪些CUDA版本 ls /usr/local/cuda*3. 修改環境變量(永久生效) 編輯…

Linux基礎開發工具(gcc/g++,yum,vim,make/makefile)

目錄 軟件包管理器——yum Linux下&#xff0c;軟件的安裝 yum與軟件包的關系 yum命令的運用 1.查看軟件包 2.安裝/刪除軟件包 編輯器——vim vim的基本概念 vim的基本操作 命令模式命令 移動光標 刪除文字 撤銷上一次操作 跳至指定的行 底行模式命令 編譯器——…

數據結構之跳表

跳表&#xff08;Skip List&#xff09;是一種基于概率平衡的數據結構&#xff0c;通過多層有序鏈表實現高效的查找、插入和刪除操作。它在最壞情況下時間復雜度為 (O(n))&#xff0c;但通過隨機化設計&#xff0c;平均時間復雜度可優化至 (O(\log n))&#xff0c;與平衡二叉搜…

線程概念,控制

一、線程概念 線程概念&#xff1a;進程內部的一個執行流&#xff0c;輕量化。 觀點&#xff1a;進程是系統分配資源的基本單位&#xff0c;線程是CPU調度的基本單位。 在理解線程之前&#xff0c;我們在談一下虛擬地址空間。 我們都知道進程是通過頁表將虛擬地址轉化為物理地址…

RabbitMQ 高可用實戰篇(Mirrored Queue + Cluster + 持久化整合)

RabbitMQ 高可用實戰篇&#xff08;Mirrored Queue Cluster 持久化整合&#xff09;1. 前言 在生產環境中&#xff0c;單節點 RabbitMQ 容易因故障導致消息丟失或業務中斷。 通過高可用隊列、集群部署和持久化策略&#xff0c;可以保證 消息可靠性、節點容錯和持續服務。 本文…

支持向量機:從理論到實踐

支持向量機&#xff1a;從理論到實踐 文章目錄支持向量機&#xff1a;從理論到實踐一。理論概述1. 線性可分支持向量機1.1 基本概念與數學形式1.2 函數間隔與幾何間隔1.3 間隔最大化與優化問題1.4 拉格朗日對偶理論與求解1.5 支持向量與決策函數2. 近似線性可分數據&#xff08…

LVS與Keepalived詳解(二)LVS負載均衡實現實操

文章目錄前言一、LVS-DR 模式詳解1.1 數據包流向分析1.2 DR 模式的特點二、LVS-DR 集群部署實戰2.1 環境準備2.2 配置負載調度器&#xff08;Director Server&#xff09;2.3 配置節點服務器&#xff08;Real Server&#xff09;2.4 測試驗證三、前期回顧3.1 LVS 三種工作模式及…

歸一化實現原理

歸一化&#xff08;Normalization&#xff09;是一種將數據轉換到相同尺度的預處理技術&#xff0c;它通常用于讓不同特征&#xff08;或數據項&#xff09;具有相同的量綱或范圍。在聯邦學習中&#xff0c;歸一化可以用來處理非獨立同分布&#xff08;Non-IID&#xff09;**數…

企業級實戰:構建基于Qt、C++與YOLOv8的模塊化工業視覺檢測系統

一、概述 在追求高效與精密的現代制造業中&#xff0c;自動化光學檢測&#xff08;AOI&#xff09;已成為保障產品質量的核心技術。傳統的質檢流程往往受限于人工效率與主觀判斷&#xff0c;難以滿足大規模、高精度的生產需求。本文旨在研發一套完整的、企業級的工業視覺異常檢…

【目標檢測】metrice_curve和loss_curve對比圖可視化

代碼如下&#xff1a; import warnings warnings.filterwarnings(ignore)import os import pandas as pd import numpy as np import matplotlib.pylab as pltpwd os.getcwd()names [model1, model2, model3,ours]plt.figure(figsize(10, 10))plt.subplot(2, 2, 1) for i in …

【LeetCode hot100|Week2】滑動窗口,子串

筆記用于個人復習和鞏固&#xff0c;題解非原創&#xff0c;參考LeetCode官方題解以及各個大佬的解法&#xff0c;希望給大家帶來幫助&#xff0c;同時筆記也能督促我學習進步 這周主要把滑動窗口和子串的題目刷了一遍 文章目錄Week2D1 滑動窗口209. 長度最小的子數組713. 乘積…

vue2純前端對接海康威視攝像頭實現實時視頻預覽

vue2純前端對接海康威視攝像頭實現實時視頻預覽一、環境準備二、代碼集成1.1 準備webrtcstreamer.js&#xff0c;粘貼即用&#xff0c;不用做任何修改1.2 封裝視頻組件&#xff0c;在需要視頻的地方引入此封裝的視頻組件即可&#xff0c;也是粘貼即用&#xff0c;注意其中impor…

Android 設置禁止截圖和禁止長截圖

1.禁止截圖 在 Activity 代碼中 , 可以在調用 setContentView 函數之前 ,為 Window 窗口對象 設置 LayoutParams.FLAG_SECURE 標志位 , 可以禁止對本界面進行截屏 ,Window 窗口對象 , 可通過 getWindow 方法獲取 ,核心代碼如下 :getWindow().setFlags(LayoutParams.FLAG_SECUR…

AR 巡檢在工業的應用|阿法龍XR云平臺

AR 巡檢的應用覆蓋電力、石油化工、智能制造、軌道交通、冶金等對設備可靠性和安全性要求極高的行業&#xff0c;具體場景包括&#xff1a;電力行業變電站內設備的狀態檢查&#xff1a;通過 AR 眼鏡掃描設備&#xff0c;實時顯示設備額定參數、歷史故障記錄、實時傳感器數據&am…

【C++】STL詳解(七)—stack和queue的介紹及使用

? 堅持用 清晰易懂的圖解 代碼語言&#xff0c; 讓每個知識點都 簡單直觀 &#xff01; &#x1f680; 個人主頁 &#xff1a;不呆頭 CSDN &#x1f331; 代碼倉庫 &#xff1a;不呆頭 Gitee &#x1f4cc; 專欄系列 &#xff1a; &#x1f4d6; 《C語言》&#x1f9e9; 《…

深度學習周報(9.8~9.14)

目錄 摘要 Abstract 1 LSTM相關網絡總結與對比 1.1 理論總結 1.2 代碼運行對比 2 量子計算入門 3 總結 摘要 本周首先總結了LSTM、Bi-LSTM與GRU的區別與優缺點&#xff0c;對比了三者實戰的代碼與效果&#xff0c;還另外拓展了一些循環神經網絡變體&#xff08;包括窺視…

Quat 四元數庫使用教程:應用場景概述

基礎概念 四元數是一個包含四個元素的數組 [x, y, z, w]&#xff0c;其中 x,y,z表示虛部&#xff0c;w 表示實部。單位四元數常用于表示3D空間中的旋轉。 1. 創建和初始化函數 create() - 創建單位四元數 應用場景&#xff1a;初始化一個新的四元數對象&#xff0c;通常作為其他…

【Java后端】Spring Boot 多模塊項目實戰:從零搭建父工程與子模塊

如何用 Spring Boot 搭建一個父工程 (Parent Project)&#xff0c;并在其中包含多個子模塊 (Module)&#xff0c;適合企業級項目或者需要分模塊管理的場景。Spring Boot 多模塊項目實戰&#xff1a;從零搭建父工程與子模塊在日常開發中&#xff0c;我們經常會遇到這樣的需求&am…

企業級AI會議系統技術實現:快鷺如何用AI重構會議全流程

摘要 本文深度解析快鷺AI會議系統的核心技術架構&#xff0c;重點探討其在語音識別、自然語言處理、數據集成和安全防護等方面的技術實現。通過對比傳統會議系統的技術痛點&#xff0c;分析快鷺AI如何通過技術創新實現會議籌備時間減少67%、數據調取速度提升100倍的顯著效果。…