資深Java工程師的面試題目(一)并發編程

以下是幾道針對Java并發編程的面試題,涵蓋基礎知識、高級概念和實際應用場景,適合資深Java工程師的面試評估:


1. 線程池與任務調度

題目:

  • 描述Java線程池的核心參數(如corePoolSizemaximumPoolSizekeepAliveTime等)的作用,并說明如何根據業務場景選擇合適的線程池類型(如newFixedThreadPoolnewCachedThreadPool)。
  • 請解釋以下代碼片段中線程池的潛在問題,并提出改進建議:
    ExecutorService executor = Executors.newFixedThreadPool(10);
    for (int i = 0; i < 1000; i++) {executor.submit(() -> {// 執行耗時操作});
    }
    

參考答案:

  • 核心參數作用:

    • corePoolSize:核心線程數,線程池中始終存活的線程數量。
    • maximumPoolSize:最大線程數,線程池允許創建的最大線程數。
    • keepAliveTime:非核心線程的存活時間,超過核心數的線程在空閑后會被銷毀。
    • workQueue:任務隊列,用于緩存未執行的任務。
    • threadFactory:線程工廠,用于創建線程。
    • handler:拒絕策略,當任務隊列和線程數均滿時的處理方式。
  • 線程池類型選擇:

    • newFixedThreadPool:固定大小的線程池,適合負載穩定的場景(如Web服務器)。
    • newCachedThreadPool:可緩存的線程池,適合短時任務(如異步處理)。
    • newScheduledThreadPool:支持定時任務,適合周期性任務(如定時清理緩存)。
  • 代碼問題:

    • 使用newFixedThreadPool(10)提交1000個任務,可能導致任務隊列堆積(默認使用無界隊列LinkedBlockingQueue),占用大量內存甚至導致OOM。
    • 改進建議:
      1. 指定有界隊列(如ArrayBlockingQueue),并設置合理的拒絕策略(如CallerRunsPolicy)。
      2. 根據任務類型調整線程池大小(如CPU密集型任務線程數為CPU核心數 + 1,IO密集型任務線程數可更高)。

2. 鎖與同步機制

題目:

  • 比較synchronized關鍵字和ReentrantLock的優缺點,并說明在哪些場景下更適合使用ReentrantLock
  • 請分析以下代碼中的線程安全問題,并提供解決方案:
    public class Counter {private int count = 0;public void increment() {count++;}
    }
    

參考答案:

  • synchronized vs ReentrantLock:

    • 相同點:都支持可重入性,能解決線程安全問題。
    • 不同點
      • 靈活性ReentrantLock支持嘗試加鎖(tryLock)、超時加鎖、條件變量(Condition)等高級功能,而synchronized只能通過隱式鎖實現。
      • 性能:在低競爭場景下,synchronized性能接近ReentrantLock;在高競爭場景下,ReentrantLock可通過公平鎖策略減少線程饑餓。
      • 使用方式synchronized通過語法糖實現(如方法或代碼塊),而ReentrantLock需要顯式加鎖和釋放(需在finally中釋放)。
  • 代碼問題

    • count++操作(即count = count + 1)不是原子操作,存在線程安全問題(多個線程可能同時讀取并更新count的舊值)。
    • 解決方案
      1. 使用synchronized修飾increment方法。
      2. 使用ReentrantLock手動加鎖。
      3. 使用原子類AtomicInteger替代普通int

3. 并發工具類

題目:

  • 請說明CountDownLatchCyclicBarrierSemaphore的使用場景及區別,并提供一個實際應用案例。
  • 編寫一個使用CyclicBarrier的示例代碼,模擬多個線程協作完成任務的場景。

參考答案:

  • 工具類對比:

    • CountDownLatch:用于等待一組線程完成任務后繼續執行(如主線程等待所有子線程完成)。
    • CyclicBarrier:用于多個線程相互等待,達到屏障點后再同時繼續執行(如多線程并行計算后匯總結果)。
    • Semaphore:用于控制同時訪問某個資源的線程數量(如限流)。
  • 案例

    • CyclicBarrier示例:模擬3個線程分別計算數組的不同部分,匯總結果后再輸出:
      public class CyclicBarrierExample {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads have finished their part!"));int[] data = {1, 2, 3, 4, 5, 6};for (int i = 0; i < 3; i++) {new Thread(() -> {int sum = 0;for (int j = 0; j < 2; j++) {sum += data[ThreadLocalRandom.current().nextInt(data.length)];}System.out.println("Thread " + Thread.currentThread().getId() + " computed sum: " + sum);try {barrier.await();} catch (Exception e) {e.printStackTrace();}}).start();}}
      }
      

4. 性能優化與死鎖

題目:

  • 如何通過JVM參數和工具(如jstackVisualVM)定位和解決線程死鎖問題?
  • 請分析以下代碼可能引發死鎖的原因,并提出優化方案:
    public class Deadlock {private final Object lock1 = new Object();private final Object lock2 = new Object();public void methodA() {synchronized (lock1) {synchronized (lock2) {// 業務邏輯}}}public void methodB() {synchronized (lock2) {synchronized (lock1) {// 業務邏輯}}}
    }
    

參考答案:

  • 死鎖定位與解決:

    1. 使用jstack <pid>生成線程堆棧,查找BLOCKED狀態的線程及鎖依賴關系。
    2. 使用VisualVM的線程分析工具查看線程狀態和鎖競爭情況。
    3. 解決方案:避免嵌套鎖,或統一鎖順序(如始終先獲取lock1再獲取lock2)。
  • 代碼問題:

    • 死鎖原因:methodAmethodB以相反順序獲取鎖(lock1lock2 vs lock2lock1),可能導致兩個線程互相等待對方釋放鎖。
    • 優化方案
      1. 統一鎖順序(如始終先獲取lock1再獲取lock2)。
      2. 使用ReentrantLock.tryLock()嘗試加鎖,超時后回退。

5. 高級并發模式

題目:

  • 請描述生產者-消費者模型的實現方式,并說明如何通過BlockingQueue優化該模型。
  • 使用CompletableFuture編寫一個異步任務鏈,要求:
    1. 并行執行兩個任務(如查詢數據庫和查詢緩存)。
    2. 合并結果并返回最終數據。

參考答案:

  • 生產者-消費者模型:

    • 使用BlockingQueue(如ArrayBlockingQueue)實現線程間通信,生產者將任務放入隊列,消費者從隊列取出任務處理。
    • 優點:解耦生產者與消費者,避免忙等(busy-wait)。
  • CompletableFuture示例:

    public class AsyncExample {public static void main(String[] args) {CompletableFuture<String> dbFuture = CompletableFuture.supplyAsync(() -> {// 模擬數據庫查詢return "DB Result";});CompletableFuture<String> cacheFuture = CompletableFuture.supplyAsync(() -> {// 模擬緩存查詢return "Cache Result";});dbFuture.thenCombine(cacheFuture, (db, cache) -> {// 合并結果return db + " + " + cache;}).thenAccept(result -> {System.out.println("Final Result: " + result);});}
    }
    

6. JVM與并發安全

題目:

  • 解釋volatile關鍵字的作用原理,并說明它與synchronized在可見性、原子性和有序性上的區別。
  • 請分析以下代碼為何不滿足線程安全,并提出改進方案:
    public class VolatileExample {private volatile int counter = 0;public void increment() {counter++;}
    }
    

參考答案:

  • volatile原理:

    • volatile通過內存屏障(Memory Barrier)確保變量的可見性和禁止指令重排序,但不保證原子性。
    • synchronized的區別:
      • 可見性:兩者均保證可見性。
      • 原子性synchronized保證原子性,volatile不保證。
      • 有序性volatile通過禁止指令重排序保證部分有序性,而synchronized通過鎖的釋放和獲取保證整體有序性。
  • 代碼問題:

    • counter++操作(readincrementwrite)不是原子的,即使countervolatile,多個線程仍可能覆蓋彼此的修改。
    • 改進方案
      1. 使用synchronized修飾increment方法。
      2. 使用原子類AtomicInteger

7. 實戰問題

題目:

  • 設計一個線程安全的緩存類,要求:
    1. 支持并發讀取和寫入。
    2. 提供過期時間(TTL)功能,自動清除過期數據。
    3. 支持高并發下的性能優化。

參考答案:

  • 設計思路:
    1. 使用ConcurrentHashMap存儲緩存數據,鍵為緩存項的唯一標識,值為帶有TTL的封裝對象。
    2. 使用ReentrantReadWriteLock實現讀寫分離:
      • 讀操作共享鎖,允許多線程并發讀。
      • 寫操作獨占鎖,確保單線程寫入。
    3. 使用定時任務(如ScheduledExecutorService)定期清理過期數據。
    4. 代碼示例:
    public class ConcurrentCache<K, V> {private final ConcurrentHashMap<K, CacheEntry<V>> cache = new ConcurrentHashMap<>();private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);public ConcurrentCache() {scheduler.scheduleAtFixedRate(this::cleanUp, 1, 1, TimeUnit.MINUTES);}public V get(K key) {lock.readLock().lock();try {CacheEntry<V> entry = cache.get(key);if (entry == null || entry.isExpired()) {return null;}return entry.getValue();} finally {lock.readLock().unlock();}}public void put(K key, V value, long ttl, TimeUnit unit) {lock.writeLock().lock();try {cache.put(key, new CacheEntry<>(value, System.currentTimeMillis() + unit.toMillis(ttl)));} finally {lock.writeLock().unlock();}}private void cleanUp() {lock.writeLock().lock();try {cache.entrySet().removeIf(entry -> entry.getValue().isExpired());} finally {lock.writeLock().unlock();}}private static class CacheEntry<V> {private final V value;private final long expireTime;public CacheEntry(V value, long expireTime) {this.value = value;this.expireTime = expireTime;}public V getValue() {return value;}public boolean isExpired() {return System.currentTimeMillis() > expireTime;}}
    }
    

以上題目覆蓋了Java并發編程的核心知識點,包括線程池、鎖機制、并發工具類、性能優化、死鎖處理以及高階設計模式。通過這些問題,可以全面評估候選人對并發編程的理解和實際應用能力。

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

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

相關文章

解決Spark4.0.0依賴問題

Apache Spark 4.0.0 沖突解決指南 1. 問題背景 在嘗試運行一個基于 Apache Spark 4.0.0 的 Java 應用程序。根據 Spark 4.0.0 的發布說明&#xff0c;該版本默認支持 Scala 2.13 和 JDK 17。在初始設置和運行過程中&#xff0c;遇到了以下主要問題&#xff1a; 依賴沖突 (PO…

什么是SeaTunnel

SeaTunnel&#xff1a;高性能、分布式數據集成平臺 1. 什么是SeaTunnel&#xff1f; SeaTunnel&#xff08;原名Waterdrop&#xff09;是一個高性能、分布式、可擴展的數據集成平臺&#xff0c;專為大規模數據同步、ETL&#xff08;Extract, Transform, Load&#xff09;和實…

Android 使用OkHttp 下載文件失敗問題定位和修復

一、背景 使用Okhttp下載文件時,存在失敗情況,剛開始以為是網絡問題,后面添加相關日志發現,是在網絡波動比較大的情況下,被判為timeout超時,結束了下載任務。 二、解決方案 有問題的下載配置寫法: 注:這里只是展示配置下載的關鍵代碼 val client OkHttpClient()val request…

【Docker基礎】Docker核心概念:命名空間(Namespace)之PID詳解

目錄 引言 1 基礎概念回顧 1.1 命名空間概述 1.2 命名空間的類型 2 PID命名空間詳解 2.1 PID命名空間的概念 2.2 PID命名空間的作用 2.3 PID命名空間的工作原理 2.3.1 PID命名空間的創建與銷毀 2.3.2 PID命名空間的層次結構 2.3.3 PID命名空間的進程ID映射 3 PID命…

SSM框架:企業級Java開發利器

SSM框架詳解&#xff1a;Java企業級開發的核心基石 SSM框架是Java企業級開發中最流行的框架組合&#xff0c;由Spring、Spring MVC和MyBatis三大框架整合而成。這個輕量級的框架組合為Java開發者提供了高效、靈活的企業級應用解決方案。 一、SSM框架組成解析 1. Spring框架 …

網絡安全中的人工智能應用

人工智能&#xff08;AI&#xff09;在網絡安全中的應用從根本上改變了企業抵御網絡威脅的方式。它利用先進的機器學習&#xff08;ML&#xff09;算法分析多源海量風險數據&#xff0c;挖掘威脅模式&#xff0c;從而更輕松地快速應對新興風險。AI 能以驚人的速度和準確性幫助發…

Vue + Spring Boot 前后端交互實踐:正確使用 `Content-Type: application/json` 及參數傳遞方式

在前后端分離開發中&#xff0c;前端通過 HTTP 請求與后端進行數據交互是常見的操作。其中&#xff0c;Content-Type 是決定請求體格式的重要字段之一。本文將以一個具體的例子出發&#xff0c;講解如何在 Vue 前端 使用 Axios 發送 JSON 格式請求&#xff0c;并在 Spring Boot…

微服務拆分 SpringCloud

拆分原則 什么時候拆分 大多數小型項目&#xff1a; 一般是先采用單體架構&#xff0c;隨著用戶規模擴大、業務復雜后再逐漸拆分為微服務架構&#xff08;前易后難&#xff09;。確定的大型項目&#xff1a; 資金充足&#xff0c;目標明確&#xff0c;可以直接選擇微服務架構…

DataX Hive寫插件深度解析:從數據寫入到Hive表關聯實戰

引言 在大數據處理流程中&#xff0c;將數據高效寫入Hive表是數據倉庫建設的關鍵環節。DataX作為阿里巴巴開源的數據同步工具&#xff0c;其Hive寫插件&#xff08;Hdfswriter&#xff09;提供了將數據寫入HDFS并與Hive表無縫關聯的能力。本文將系統介紹Hdfswriter的功能特性、…

基于國產USRP搭建十六通道同步采集系統, 耗費200萬 歡迎免費體驗

隨著無線通信、雷達探測和電子偵察等技術的發展&#xff0c;多通道信號同步采集的需求日益突出。我司基于8臺USRP-LW N321設備&#xff0c;構建了一套高精度十六路通道信號同步采集系統&#xff0c;該系統通過并行采集與精確時頻對齊&#xff0c;可為空間譜測向和MIMO系統等關鍵…

《前端編譯工具源映射配置:Webpack與Gulp的深度剖析》

當我們深入探索不同前端編譯工具時&#xff0c;Webpack與Gulp在源映射配置上的差異與特色&#xff0c;如同隱藏在代碼深處的神秘寶藏&#xff0c;等待我們去挖掘、去解讀。 Webpack作為現代前端構建的核心工具&#xff0c;在源映射配置方面展現出了高度的靈活性與可定制性。它…

4. 時間序列預測的自回歸和自動方法

4.1自回歸 自回歸是一種時間序列預測方法&#xff0c;僅依賴于時間序列的先前輸出&#xff1a;該技術假設下一個時間戳的未來觀測值與先前時間戳的觀測值存在線性關系。 在自回歸中&#xff0c;前一個時間戳的輸出值成為預測下一個時間戳的輸入值&#xff0c;并且誤差遵循簡單線…

Android 多屏幕旋轉控制原理與實戰

在嵌入式設備、雙顯示終端或定制系統中&#xff0c;Android 多屏幕控制&#xff08;尤其是屏幕方向旋轉&#xff09;是一個兼具挑戰與價值的功能模塊。本文將深入分析如何識別多個顯示、如何通過系統 API 控制旋轉&#xff0c;并討論為何某些 displayId 無法旋轉。 &#x1f4c…

faiss上的GPU流程,GPU與CPU之間的聯系

GPU使用流程 1、初始化階段 1.1:初始化GPU資源對象 目的: 為GPU上的操作分配和管理資源,例如臨時內存和CUDA流。 操作: 創建StandardGpuResources對象來管理GPU的內存和計算資源。例如: faiss::gpu::StandardGpuResources res; res.setTempMemory(1024 * 1024 * 512); …

在CentOS 7系統安裝PostgreSQL 15時出現`libzstd.so.1`依賴缺失問題

--> 正在處理依賴關系 libzstd.so.1()(64bit)&#xff0c;它被軟件包 postgresql15-server-15.13-1PGDG.rhel7.x86_64 需要---> 軟件包 python3-pip.noarch.0.9.0.3-8.el7 將被 安裝---> 軟件包 python3-setuptools.noarch.0.39.2.0-10.el7 將被 安裝--> 解決依賴關…

走進Coinate|迪拜第二大交易平臺如何構建極速金融引擎

在加密資產交易飛速發展的今天&#xff0c;技術實力已成為交易平臺生存與發展的核心競爭力。與那些高調營銷卻技術薄弱的平臺不同&#xff0c;來自迪拜的頭部交易平臺——Coinate&#xff0c;則始終堅持”以技術立命”的發展路徑。 在迪拜這片充滿創新與資本活力的中東熱土&am…

手機日志是什么?如何調試手機日志

目錄 一、手機日志的類型&#xff1a; 二、如何查看和調試手機日志&#xff08;以 Android 為例&#xff09;&#xff1a; 方法 1&#xff1a;使用 Android Studio ADB&#xff08;推薦&#xff09; 方法 2&#xff1a;使用手機端日志工具&#xff08;免電腦&#xff09; …

篇章八 論壇系統——業務開發——登錄

目錄 1.登錄 1.1 順序圖 1.2 參數要求 1.3 接口規范 1.4 實現流程 1.編寫SQL 2.dao層接口 3.定義Service接口 4.實現Service接口 5.單元測試 6. Controller實現方法對外提供API接口 7.測試API接口 8.實現前端邏輯,完成前后端交互 ?編輯 1.登錄 1.1 順序圖 1.2 參…

AI-Compass前沿速覽:從企業級智能體CoCo到騰訊開源3D建模,Meta視頻預測模型V-JEPA 2、小紅書開源文本大模型

AI 大事件 智譜推出首個企業級超級助手 Agent——CoCo**[1]** 智譜推出首個企業級超級助手 Agent——CoCo&#xff0c;具備交付導向、記憶機制和無縫嵌入三大企業級特性。能全流程輔助工作&#xff0c;根據員工職能和需求主動服務&#xff0c;無縫接入企業資源&#xff0c;提…

element ui el-table嵌套el-table,實現checkbox聯動效果

HTML代碼&#xff1a; <el-table header-row-class-name"my-el-table-header" row-class-name"my-el-table-body" ref"multipleGroupTable" :data"vehicleGroupTableData" tooltip-effect"dark" style"width: 100…