Java面試-線程安全篇

一、synchronized關鍵字:

  • 基本使用與作用:通過搶票代碼示例,展示了synchronized作為對象鎖,可避免多線程超賣或搶到同一張票問題,保證代碼原子性,同一時刻只有一個線程獲得鎖,其他線程阻塞。
  • 底層原理:底層是monitor,通過分析字節碼信息,可看到monitor entermonitor exit,分別對應上鎖和解鎖,且有兩個monitor exit以防異常導致鎖未釋放。
  • monitor工作機制monitorwait setentry listowner三個屬性。線程嘗試獲取鎖時,若ownernone,則擁有鎖;否則進入entry list等待,釋放鎖后喚醒entry list中線程爭搶。調用wait方法的線程進入wait set
  • 鎖升級monitor是重量級鎖,因涉及用戶態和內核態切換,性能低。JDK1.6后引入偏向鎖和輕量級鎖。一個線程重復獲取鎖時用偏向鎖;兩個線程交替獲取鎖用輕量級鎖;多線程競爭時用重量級鎖。
  • 三種鎖對比:偏向鎖性能最好,首次加鎖記錄線程ID并改標志,后續重入只需判斷;輕量級鎖每次加鎖記錄都需CAS操作;重量級鎖涉及用戶態和內核態切換,性能最低。

二、Java內存模型(JMM)面試題:

  • 概念:定義了共享變量在多線程讀寫操作的行為規范,保證內存讀寫指令正確性。
  • 內存劃分:分為工作內存和主內存。工作內存是線程私有,存儲線程內私有數據,線程間無法互相訪問;主內存是共享區域,存儲共享變量,多線程同步數據需通過主內存。
  • CAS操作面試題
    • 概念與原理:全稱compare and swap,體現樂觀鎖思想,在無鎖情況下保證線程操作共享數據的原子性。線程操作共享數據時,先讀取主內存數據到工作內存,修改后與主內存數據比對,相同則更新,不同則自旋重試。
    • 底層實現:依賴unsafe類調用操作系統底層CAS指令,unsafe類提供compare and swap objectintlong三個本地方法。
    • 與鎖的對比:CAS是樂觀鎖,不怕其他線程修改共享變量,通過自旋重試;synchronized是悲觀鎖,上鎖后防止其他線程修改。

三、volatile`關鍵字:

  • 含義:可修飾共享變量,保證線程間可見性和禁止指令重排序。

  • 線程間可見性:通過代碼示例,展示了未加volatile時,線程修改共享變量,其他線程不可見,原因是JIT編譯器優化。可通過加VM參數禁用JIT或加volatile關鍵字解決,項目開發中推薦使用volatile關鍵字。

  • 指令重排序與volatile關鍵字

    • 指令重排序概念:代碼執行順序可能與編寫順序不一致,通過測試代碼可能出現結果為10的情況判斷是否發生重排序,需使用高并發多線程測試工具。
    • volatile解決重排序:在共享變量讀寫時加入不同屏障,阻止其他讀寫操作越過屏障。如加在y上能解決問題,加在x上不行。
    • volatile使用技巧:寫變量時讓volatile修飾的變量在代碼最后位置,讀變量時讓其在代碼最上面。
    • volatile特性總結:保證線程間可見性,禁止指令重排序。

四、AQS(抽象隊列同步器):

  • AQS定義與對比:是JUC中提供的鎖機制,與synchronized對比,它是Java API,需手動開關鎖,在鎖競爭激烈時性能更好。
  • 基本工作機制:內部有volatile修飾的state,0表示無鎖,1表示有鎖。線程請求鎖需修改state,失敗則進入隊列等待,隊列為先進先出的雙向隊列。
  • 保證原子性:多個線程搶資源時用CAS設置保證原子性。
  • 公平鎖與非公平鎖:非公平鎖是新線程與隊列中線程共同搶資源;公平鎖是新線程到隊列尾部等待,按隊列順序獲得鎖。
  • AQS總結:是隊列同步器,維護雙向隊列,用state控制鎖,使用CAS保證原子性。

五、ReentrantLock(可重入鎖):

  • 特點:可中斷、可設置超時時間、可設置公平鎖、支持多個條件變量,與synchronized一樣支持重入。
  • 實現原理:底層使用CAS和AQS,構造函數可創建公平鎖或非公平鎖。
  • 工作方式:與AQS類似,用CAS修改狀態搶鎖,搶到鎖將線程掛到屬性中,釋放鎖喚醒隊列中線程。
  • 總結:是可重入鎖,底層用CAS和AQS,支持公平和非公平鎖。

六、synchronized與Lock對比:

  • 語法層面:synchronized是關鍵字,由JVM提供,C++實現,退出同步塊自動釋放鎖;Lock由JDK提供,Java實現,需調用unlock釋放鎖。
  • 功能層面:都屬悲觀鎖,有互斥同步和鎖重入功能,但Lock有公平鎖、可打斷、可超時、多條件變量等功能,通過代碼演示驗證。
  • 性能層面:無競爭時synchronized有優化,性能還行;競爭激烈時Lock性能更好。

七、死鎖問題:

  • 死鎖產生條件:一個線程同時獲取多把鎖易發生死鎖,如線程T1持有a鎖等b鎖,線程T2持有b鎖等a鎖。
  • 死鎖診斷工具:使用jps輸出JVM中運行的所有進程狀態信息,使用jstack查看Java進程內的線程堆棧信息;還可使用jconsole和VisualVM等可視化工具。

八、ConcurrentHashMap:

  • JDK1.7結構:采用分段的數組加列表實現,數組不可擴容,添加數據時用ReentrantLock加鎖,性能較低。
  • JDK1.8結構:采用數組加鏈表加紅黑樹結構,添加新節點用CAS自旋鎖,有鏈表或紅黑樹時用synchronized鎖首節點,性能更好。
  • 總結:不同版本底層數據結構和加鎖方式不同,1.8加鎖力度更細。

九、并發程序問題根源:

  • 原子性:一個線程在CPU中的操作不可暫停或中斷,如搶票代碼可能出現超賣,可通過synchronized或Lock鎖保證。
  • 可見性:一個線程對共享變量修改后讓另一個線程可見,可加volatile關鍵字解決,加鎖也可但性能不高。
  • 有序性:處理器可能對代碼進行指令重排,加volatile關鍵字可禁止指令重排序。

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

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

相關文章

R 語言科研繪圖 --- 其他繪圖-匯總2

在發表科研論文的過程中,科研繪圖是必不可少的,一張好看的圖形會是文章很大的加分項。 為了便于使用,本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中,獲取方式: R 語言科研繪圖模板 --- sciRplothttps://mp.…

【數學建模學習筆記】啟發式算法:粒子群算法

零基礎小白看懂粒子群優化算法(PSO)一、什么是粒子群優化算法?簡單說,粒子群優化算法(PSO)是一種模擬鳥群 / 魚群覓食的智能算法。想象一群鳥在找食物:每只鳥(叫 “粒子”&#xff0…

【Gitlab】Ubuntu 20.04服務器部署Gitlab

寫一個 適用于 Ubuntu 20.04/22.04 的 GitLab 一鍵部署腳本,包括:安裝依賴安裝 GitLab CE配置公網 IP 或域名自動開啟 HTTPS(Let’s Encrypt)配置防火墻下面是完整腳本:#!/bin/bash# # GitLab 一鍵安裝腳本 # # 1. 檢…

Android 15重磅升級:16KB內存頁機制詳解與適配指南

一、背景隨著Android硬件架構的持續演進,新一代設備開始采用16KB內存頁(Page Size)機制,逐步替代傳統的4KB內存頁設計。此項底層變更對應用兼容性產生直接影響,特別是對依賴Native層庫、JNI接口或自定義內存管理模塊的…

Mybatis-8 動態SQL

動態SQL-官方文檔 文檔地址 動態 SQL_MyBatis中文網 為什么需要動態SQL 1、動態SQL是MyBatis的強大特性之一 2、使用JDBC或其它類似的框架,根據不同條件拼接SQL語句非常麻煩,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一…

PySpark數據輸入

PySpark數據輸入 1.理解RDD對象 2.掌握PySpark數據輸入的2種方法 RDD對象 PySpark支持多種數據的輸入,在輸入完成后,都會得到一個:RDD類的對象 RDD全稱為:彈性分布式數據集(Resilient Distributed Datasets&#xff09…

【系統架構設計(16)】軟件架構設計二:軟件架構風格:構建系統的設計模式與選擇指南

文章目錄一、核心思想二、數據流風格:以數據流動為核心的處理模式三、調用返回風格:基于程序調用的層次化組織四、獨立構件風格:基于事件驅動的松耦合架構五、虛擬機風格:提供抽象執行環境的架構模式六、倉庫風格:以數…

MySQL速記小冊(1)

1【Q】:Mysql中的數據排序是怎么實現的?【A】:排序過程中如果字段有索引,則利用索引排序。反之使用文件排序。在文件排序中,如果數據量少則在內存中排序,使用單路排序或雙路排序。如果數據量大則利于磁盤文…

20250904 10:45_排查10.1.3.35新QMS系統RMAN備份失敗問題(優化腳本里的環境配置,增加了check_oracle_env 函數)

一、RMAN備份失敗日志如下 [2025-09-04 04:00:01] 備份腳本啟動 [2025-09-04 04:00:01] 開始 RMAN 備份 CDB: ORCLCDB Message file RMAN<lang>.msb not found Verify that ORACLE_HOME is set properly [2025-09-04 04:00:01] RMAN 備份失敗! 二、原備份腳本存檔…

Vue3源碼reactivity響應式篇之EffectScope

概述 EffectScope是Vue3中一個響應式系統的輔助類&#xff0c;用于管理副作用&#xff08;effect&#xff09;的作用域。它可以幫助我們更好地組織和管理多個effect&#xff0c;便于一起停止或暫停以及恢復&#xff0c;避免了全局狀態的污染和管理的復雜性。 每一個vue組件的實…

MySQL 日志全解析:Binlog/Redo/Undo 等 5 類關鍵日志的配置、作用與最佳實踐

1 二進制日志&#xff08;Binlog&#xff09;&#xff1a;配置與核心作用 Binlog 是 MySQL 中跨存儲引擎的核心日志&#xff0c;記錄所有數據修改操作&#xff0c;主要用于主從復制、數據備份恢復與跨庫遷移。 1.1 Binlog 核心操作 開啟 Binlog 若需開啟 Binlog&#xff0c;需在…

springboot 之 HTML與圖片生成 (2)

前言 之前寫了一篇html轉圖片的 文章&#xff0c;使用中文時會出現亂碼情況&#xff0c;后來又從網上找了下信息&#xff0c;這篇主要介紹下另一個轉換庫。 依賴 <!-- 用于將html轉圖片--><dependency><groupId>gui.ava</groupId><artifactId>…

計算機組成原理:計算機的分類

&#x1f4cc;目錄&#x1f5a5;? 計算機組成原理&#xff1a;計算機的分類——從架構到應用的全景梳理一、按處理數據類型分類&#xff1a;從“數字”到“混合”的演進&#xff08;一&#xff09;數字計算機&#xff1a;離散數據的“精準管家”1. 核心原理2. 關鍵優勢3. 典型…

數據結構——單向循環鏈表代碼(補充)

在此前的文章中&#xff08;鏈接如下&#xff09;&#xff0c;只有單向鏈表的代碼&#xff0c;接下來我們來寫單向循環鏈表&#xff0c;并用其實現一個簡單的學生信息鏈表https://blog.csdn.net/2301_80406299/article/details/151157051?spm1011.2415.3001.10575&sharefr…

【Python自動化】 21.2 Pandas 讀取 Excel 時的 dtype 參數完全指南

一、dtype 參數概述 dtype 參數用于指定列的數據類型&#xff0c;在讀取 Excel 時非常重要&#xff0c;可以&#xff1a; 提高內存效率避免自動類型推斷錯誤確保數據一致性提升讀取性能 二、基本用法 1. 基礎語法 import pandas as pd# 指定列數據類型 df pd.read_excel(data.…

gtest全局套件的測試使用

gtest全局套件的測試使用 #include <iostream> #include "gtest/gtest.h" #include <unordered_map>class MyEnvironment: public testing::Environment {public:virtual void SetUp() override{std::cout<<"單元測試前的環境初始化&#xff…

【系統分析師】第7章-基礎知識:軟件工程(核心總結)

更多內容請見: 備考系統分析師-專欄介紹和目錄 文章目錄 一、軟件工程的基本概念 1.1 定義與意義 1.2 軟件工程的基本原則 1.3 核心定義與邊界 1.4 四大核心原則 1.5 三大核心目標 二、軟件生命周期 2.1 定義與階段劃分 2.2 軟件生命周期模型 三、軟件開發方法 3.1 結構化方法…

量化基金從小白到大師 - 金融數據獲取大全:從免費API到Tick級數據實戰指南

量化基金從小白到大師 - 金融數據獲取大全&#xff1a;從免費API到Tick級數據實戰指南 各位&#xff0c;今天咱們要啃一塊硬骨頭——金融數據獲取。別看這話題基礎&#xff0c;它可是整個量化大廈的地基&#xff0c;地基不穩&#xff0c;再牛的策略都得塌房。我見過太多人&…

構建一個“會思考”的房地產數據獲取腳本

—— 跨界思維&#xff1a;從認知自適應到房源信息監測 一、認知科學視角&#xff1a;什么是“會思考” 在心理學與認知科學中&#xff0c;所謂“會思考”&#xff0c;并不是指抽象的哲學推理&#xff0c;而是指個體能在復雜環境中不斷調整行動策略。 比如&#xff0c;出行時如…

JavaScript的庫簡介

JavaScript擁有豐富的庫生態系統,類似于Python的requests、numpy或C++的Boost。這些庫分為兩大類:前端庫(如React、Vue)和后端/工具庫(如Lodash、Axios)。以下是幾個核心庫的介紹與用法示例。 常用JavaScript庫分類 前端UI庫 React:Facebook開發的組件化庫,用于構建用…