面試題004-Java-Java多線程(下)

面試題004-Java-Java多線程(下)

這里寫目錄標題

  • 面試題004-Java-Java多線程(下)
    • 題目自測
    • 題目答案
      • 1. synchronized 關鍵字的作用?
      • 2. volatile 關鍵字的作用?
      • 3. synchronized 和 volatile 的區別?
      • 4. synchronized 和 ReentrantLock 的區別?
      • 5. ThreadLocal有什么用?
      • 6. 線程池有什么用?為什么不推薦使用內置線程池?
      • 7. 如何自定義線程池?
      • 8. Java線程池有哪些參數?阻塞隊列有幾種?拒絕策略有幾種?
      • 9. 線程池處理任務的流程了解嗎?
      • 10. 如何給線程池命名?為什么建議給線程池命名?
    • 參考資料

題目自測

  • 1. synchronized 關鍵字的作用?
  • 2. volatile 關鍵字的作用?
  • 3. synchronized 和 volatile 的區別?
  • 4. synchronized 和 ReentrantLock 的區別?
  • 5. ThreadLocal有什么用?
  • 6. 線程池有什么用?為什么不推薦使用內置線程池?
  • 7. 如何自定義線程池?
  • 8. Java線程池有哪些參數?阻塞隊列有幾種?拒絕策略有幾種?
  • 9. 線程池處理任務的流程了解嗎?
  • 10. 如何給線程池命名?為什么建議給線程池命名?

題目答案

1. synchronized 關鍵字的作用?

答:在Java中synchronized關鍵字用于實現線程同步,主要解決是多個線程之間訪問相同資源不會發生數據不一致的問題。它可以作用于方法或代碼塊上,以保證同一時間只有一個線程可以執行被同步的方法或代碼塊。

  • 同步實例方法: 表示該方法在同一時間只能由一個線程訪問同一個實例。

    public class SynchronizedExample {public synchronized void synchronizedMethod() {// 同步代碼}
    }
    
  • 同步靜態方法:表示該方法在同一時間只能由一個線程訪問同一個類的所有實例。

    public class SynchronizedExample {public static synchronized void synchronizedStaticMethod() {// 同步代碼}
    }
    
  • 同步代碼塊:表示該代碼塊在同一時間只能由一個線程訪問該對象。

    public class SynchronizedExample {private final Object lock = new Object();public void synchronizedBlock() {synchronized (this) {// 同步代碼}}
    }
    

2. volatile 關鍵字的作用?

答:在Java中volatile關鍵字用于聲明變量的可見性和防止指令重排,從而提供一種輕量級的同步機制。
在可見性方面,用volatile修飾的變量,來確保一個線程對該變量的修改對其他線程立即可見。
在防止指令重排方面,volatile會禁止JVM對變量操作的指令進行重新排序。

3. synchronized 和 volatile 的區別?

答:synchronized和volatile兩個關鍵字都用于實現線程同步的機制。

  • volatile是線程同步的輕量級實現,volatile性能比synchronized要好。volatile關鍵字只能用于變量,而synchronized關鍵字可以修飾方法和代碼塊。
  • volatile能保證數據的可見性,但不能保證數據的原子性。synchronized兩者都能保證。
  • volatile主要解決變量在多個線程之間的可見性,而synchronize解決的是多個線程之間訪問資源的同步性。

4. synchronized 和 ReentrantLock 的區別?

答:synchronized和ReentrantLock都是Java中用于實現線程同步的機制,并且都是可重入鎖。

  • synchronized:
    • 是Java語言的內置關鍵字,用于對代碼塊或方法進行同步。
    • 簡單易用,直接在方法或代碼塊上使用即可。
    • 由JVM實現,使用方便,但功能較為有限。
  • ReentrantLock:
    • ReentrantLock是java.util.concurrent.locks包中的類,提供了更靈活和豐富的鎖機制(響應中斷、嘗試獲取鎖、使用條件變量等)。
    • 需要顯示的加鎖和解鎖,通過代碼來控制鎖的獲取和釋放。
    • 由Java庫實現,功能強大,靈活性高。

5. ThreadLocal有什么用?

答:ThreadLocal在Java中用于創建線程局部變量,確保每個變量都有自己的獨立副本變量,從而避免多線程共享一個變量帶來的線程安全問題,同時提高了并發性能。然而在使用ThreadLocal時需要注意內存泄露問題,由于ThreadLocal變量的生命周期與線程線相同,如果線程池中線程長時間不被銷毀,而ThreadLocal變量沒有被正確移除,可能會導致內存泄露問題,因此建議在不再使用ThreadLocal變量時顯示調用remove()方法。
它的使用場景有用戶會話管理、數據庫連接管理、事物管理等。

6. 線程池有什么用?為什么不推薦使用內置線程池?

答:Java中的線程池是一種基于池化技術設計用于執行異步任務的框架,它維護了一定數量的線程,避免頻繁地創建和銷毀線程帶來的性能開銷和資源浪費。他的主要作用是提高資源復用、提高系統穩定性、便于管理和提供靈活的并發策略。

不推薦使用內置線程池的主要原因是內置線程池等配置選項有限、不能滿足所有的應用場景的需求。Java庫中提供了幾種預定義線程的實現,如Executors類中的newFixedThreadPoolnewCacheThreadPoolnewSingleThreadExecutor等。

  • FixedThreadPool 和 SingleThreadExecutor 使用無界隊列(LinkedBlockingQueue),在任務提交速度超過執行速度時,任務隊列可能無限增長,導致內存耗盡。
  • CacheThreadPool 使用無界線程池,在高并發下可能會創建大量線程、導致系統資源耗盡。未被回收的線程可能會長時間占用資源,造成線程泄漏問題。

7. 如何自定義線程池?

答:在Java中,自定義線程池可以通過ThreadPoolExecutor類來實現。ThreadPoolExecutor提供了豐富的配置選項,如核心線程數(corePoolSize)、最大線程數(maximumPoolSize)、任務隊列(workQueue)和拒絕策略(rejectedExecutionHandler)等,可以根據具體需求進行靈活配置。

import java.util.concurrent.ArrayBlockingQueue;  
import java.util.concurrent.ThreadPoolExecutor;  
import java.util.concurrent.TimeUnit;  public class CustomThreadPoolExample {  public static void main(String[] args) {  // 核心線程數 :線程池在空閑時保留的線程數,即使沒有任務需要處理。int corePoolSize = 5;  // 最大線程數 :線程池允許創建的最大線程數。int maximumPoolSize = 10;  // 非核心線程空閑存活時間 :當線程數超過核心線程數時,多余的空閑線程的存活時間。long keepAliveTime = 1L;  // 時間單位 : 空閑線程存活時間的時間單位。TimeUnit unit = TimeUnit.SECONDS;  // 任務隊列 :用于保存等待執行任務的隊列。ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);  // 線程工廠 : 用于創建新線程。ThreadFactory threadFactory = Executors.defaultThreadFactory();  // 拒絕策略 : 當線程池和隊列都滿時,如何處理新任務RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();  // 創建ThreadPoolExecutor  ThreadPoolExecutor executor = new ThreadPoolExecutor(  corePoolSize,  maximumPoolSize,  keepAliveTime,  unit,  workQueue,  threadFactory,  handler  );  // 提交任務  for (int i = 0; i < 15; i++) {  int taskId = i;  executor.execute(() -> {  System.out.println(Thread.currentThread().getName() + " is processing " + taskId);  try {  // 模擬任務執行時間  Thread.sleep(1000);  } catch (InterruptedException e) {  Thread.currentThread().interrupt();  }  });  }  // 關閉線程池(不再接受新任務,但已提交的任務會繼續執行)  executor.shutdown();  // 等待所有任務完成  while (!executor.isTerminated()) {  // 等待一段時間  }  System.out.println("All tasks completed.");  }  
}

8. Java線程池有哪些參數?阻塞隊列有幾種?拒絕策略有幾種?

答:
線程池的參數

  • corePoolSize(核心線程數):線程池中始終保留的線程數量,即使這些線程處于空閑狀態。
  • maximumPoolSize(最大線程數):線程池中允許創建的最大線程數量。當任務隊列已滿且當前線程數小于最大線程數時,會創建新線程來處理任務。
  • keepAliveTime(空閑線程存活時間):當線程池中的線程數超過核心線程數時,多余的空閑線程在終止前等待新任務的最長時間。
  • timeUnit(時間單位):keepAliveTime 參數的時間單位。常見值包括 TimeUnit.SECONDS、TimeUnit.MILLISECONDS 等。
  • workQueue(任務隊列):用于保存等待執行任務的隊列l。
  • threadFactory(線程工廠):用于創建新線程。
  • rejectedExecutionHandler(拒絕策略):當線程池和隊列都滿時,如何處理新任務。

阻塞隊列

  • ArrayBlockingQueue:一個基于數組的有界阻塞隊列。按FIFO(先進先出)順序保存任務。
  • LinkedBlockingQueue:一個基于鏈表的可選有界阻塞隊列。通常用于無限制的任務隊列。
  • SynchronousQueue:一個不存儲元素的阻塞隊列。每個插入操作必須等待一個相應的移除操作。
  • PriorityBlockingQueue:一個基于優先級的無限阻塞隊列。任務按照優先級順序執行。
  • DelayQueue:一個基于優先級隊列的無界阻塞隊列,只有在延遲期滿時才能從隊列中取走元素。

拒絕策略

  • AbortPolicy(默認策略):拋出 RejectedExecutionException 異常,阻止系統正常工作。
  • CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務。這種策略會降低新任務的提交速度,從而減輕線程池的負載。
  • DiscardPolicy:直接丟棄任務,不拋出異常。如果允許任務丟失,這種策略可以用于避免系統過載。
  • DiscardOldestPolicy:丟棄隊列中最舊的任務(即即將執行的任務),然后重新嘗試提交新任務。

9. 線程池處理任務的流程了解嗎?

答:線程池處理任務的流程可以總結為:提交任務、檢查核心線程數、任務隊列處理、非核心線程創建、執行任務以及線程回收。

  1. 通過submit()或execute()方法提交任務
  2. 檢查核心線程數,如果當前線程數少于核心線程數,那么就創建新的核心線程來執行任務。如果當前線程數已達到核心線程數,將任務放入任務隊列。
  3. 如果任務隊列沒有滿,將任務隊列繼續放入隊列。如果任務隊列已滿,檢查當前線程數是否小于最大線程數。
  4. 如果當前線程數小于最大線程數,創建新的非核心線程執行任務,如果當前線程已經達到了最大線程數,執行拒絕策略。
  5. 線程從任務隊列取出任務執行。
  6. 線程池中的非核心線程在完成任務后不會立即銷毀,進入保持存活狀態,只有當這些線程在空閑時間超過keepAliveTime后被回收。

10. 如何給線程池命名?為什么建議給線程池命名?

答:要給線程池中的線程命名,可以自定義一個 ThreadFactory,在創建線程時設置線程名稱。

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;/*** 線程工廠,它設置線程名稱,有利于我們定位問題。*/
public final class NamingThreadFactory implements ThreadFactory {private final AtomicInteger threadNum = new AtomicInteger();private final String name;/*** 創建一個帶名字的線程池生產工廠*/public NamingThreadFactory(String name) {this.name = name;}@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r);t.setName(name + " [#" + threadNum.incrementAndGet() + "]");return t;}
}

在 Java 中,為線程池中的線程命名是一種良好的實踐。命名線程有助于調試和監控,使得可以輕松識別和跟蹤線程的行為和狀態。

參考資料

  • JavaGuide
  • 牛客網-Java面試寶典

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

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

相關文章

成人高考本科何時報名-深職訓學校幫您規劃學習之路

你有想過繼續深造自己的學歷嗎&#xff1f;也許你已經工作多年&#xff0c;但總覺得學歷是一塊心病&#xff0c;想要通過成人高考本科來提升自己。不用著急&#xff0c;今天我們來聊一聊成人高考本科的報名時間&#xff0c;以及深職訓學校如何幫助你順利完成報名。 深圳成人高…

LeetCode-刷題記錄-滑動窗口合集(本篇blog會持續更新哦~)

一、滑動窗口概述 滑動窗口&#xff08;Sliding Window&#xff09;是一種用于解決數組&#xff08;或字符串&#xff09;中子數組&#xff08;或子串&#xff09;問題的有效算法。 Sliding Window核心思想&#xff1a; 滑動窗口技術的基本思想是維護一個窗口&#xff08;一般…

怎樣在Python中使用oobabooga的API密鑰,通過端口5000獲取模型列表的授權

題意&#xff1a; oobabooga-textgen-web-ui how to get authorization to view model list from port 5000 via the oobas api-key in python 怎樣在Python中使用oobabooga的API密鑰&#xff0c;通過端口5000獲取模型列表的授權 問題背景&#xff1a; I wish to extract an…

fastapi+vue3前后端分離開發第一個案例整理

開發思路 1、使用fastapi開發第一個后端接口 2、使用fastapi解決cors跨域的問題。cors跨域是瀏覽器的問題&#xff0c;只要使用瀏覽器&#xff0c;不同IP或者不同端口之間通信&#xff0c;就會存在這個問題。前后端分離是兩個服務&#xff0c;端口不一樣&#xff0c;所以必須要…

PCA和PCoA分析的python代碼

主成分分析(PCA)和主坐標分析(PCoA)都是數據降維和可視化的常用方法,但它們在適用場景和計算方法上有一些重要區別。 主成分分析(PCA) 定義: PCA是一種線性降維方法,通過正交變換將原始數據轉化為一組線性不相關的變量(主成分)。這些主成分是數據中方差最大的方向。…

XLSX + LuckySheet + LuckyExcel實現前端的excel預覽

文章目錄 功能簡介簡單代碼實現效果參考 功能簡介 通過LuckyExcel的transformExcelToLucky方法&#xff0c; 我們可以把一個文件直接轉成LuckySheet需要的json字符串&#xff0c; 之后我們就可以用LuckySheet預覽excelLuckyExcel只能解析xlsx格式的excel文件&#xff0c;因此對…

.NET 漏洞分析 | 某ERP系統存在SQL注入

01閱讀須知 此文所提供的信息只為網絡安全人員對自己所負責的網站、服務器等&#xff08;包括但不限于&#xff09;進行檢測或維護參考&#xff0c;未經授權請勿利用文章中的技術資料對任何計算機系統進行入侵操作。利用此文所提供的信息而造成的直接或間接后果和損失&#xf…

Java中s-EJB 與 e-EJB的區別

在Java中&#xff0c;關于“s-EJB”與“e-EJB”的區分&#xff0c;實際上可能存在一定的誤解或混淆&#xff0c;因為在標準的EJB&#xff08;Enterprise JavaBeans&#xff09;術語中&#xff0c;并沒有直接稱為“s-EJB”和“e-EJB”的明確分類。然而&#xff0c;為了嘗試解答這…

【Postman gRPC測試全攻略】探索微服務通信的新紀元

標題&#xff1a;【Postman gRPC測試全攻略】探索微服務通信的新紀元 gRPC是一種高性能、開源和通用的RPC框架&#xff0c;由Google主導開發&#xff0c;它使用Protocol Buffers作為接口描述語言和消息交換格式。Postman作為API開發的利器&#xff0c;也提供了對gRPC服務的測試…

封裝2個函數

1 #include "key1.h"2 //封裝EXTI章節函數3 void hal_exti_init(int exti,unsigned int i)4 {5 switch(exti)6 {7 case 9:8 //使能GPIOF外設時鐘9 RCC->MP_AHB4ENSETR | (0x1<<5);10 //將PF9設置為輸出模式11 …

MyBatis(22)如何在 MyBatis 中使用注解而不是 XML 映射文件

在 MyBatis 中&#xff0c;使用注解而不是 XML 映射文件來進行 SQL 映射是一種更為簡潔直觀的方式&#xff0c;尤其適用于 SQL 語句較少的場景。通過注解&#xff0c;開發者可以直接在接口方法上聲明 SQL 語句&#xff0c;這樣可以減少項目中的配置文件數量&#xff0c;使得項目…

學習筆記——動態路由——OSPF(認證)

十二、OSPF鄰居認證 1、OSPF鄰居認證概述 鏈路是路由器接口的另一種說法&#xff0c;因此OSPF也稱為接口狀態路由協議。OSPF通過路由器之間通告網絡接口的狀態來建立鏈路狀態數據庫&#xff0c;生成最短路徑樹&#xff0c;每個OSPF路由器使用這些最短路徑構造路由表。 OSPF認…

基于Vue框架實現的記事本

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>懶人記事本</title><style>body {fo…

深度網絡現代實踐 - 深度前饋網絡之反向傳播和其他的微分算法篇

序言 反向傳播&#xff08;Backpropagation&#xff0c;簡稱backprop&#xff09;是神經網絡訓練過程中最關鍵的技術之一&#xff0c;尤其在多層神經網絡中廣泛應用。它是一種與優化方法&#xff08;如梯度下降法&#xff09;結合使用的算法&#xff0c;用于計算網絡中各參數的…

大數據面試題之數倉(1)

目錄 介紹下數據倉庫 數倉的基本原理 數倉架構 數據倉庫分層(層級劃分)&#xff0c;每層做什么?分層的好處? 數據分層是根據什么? 數倉分層的原則與思路 知道數倉建模常用模型嗎?區別、優缺點? 星型模型和雪花模型的區別?應用場景?優劣對比 數倉建模有哪些方式…

【Symfony社區全接觸】深入探索文檔與支持資源

標題&#xff1a;【Symfony社區全接觸】深入探索文檔與支持資源 Symfony是一個強大的PHP框架&#xff0c;擁有一個活躍的開發者社區和豐富的文檔資源。這些資源對于學習和使用Symfony至關重要。本文將詳細介紹Symfony的文檔和社區支持&#xff0c;包括官方文檔、社區論壇、郵件…

如何計算弧線彈道的落地位置

1&#xff09;如何計算弧線彈道的落地位置 2&#xff09;Unity 2021 IL2CPP下使用Protobuf-net序列化報異常 3&#xff09;編譯問題&#xff0c;用Mono可以&#xff0c;但用IL2CPP就報錯 4&#xff09;Wwise的Bank在安卓上LoadBank之后&#xff0c;播放沒有聲音 這是第393篇UWA…

02 數據加工層 如何搭建用戶與內容的標準規范體系

你好&#xff0c;我是周大壯。 01 講我們提到了個性化流量分發體系的四個階段&#xff0c;并著重講解了數據采集階段的內容。那么&#xff0c;這一講我們主要圍繞數據加工階段的內容進行詳細講解。 在課程開始之前&#xff0c;我們先舉一個場景進行說明。 近年來&#xff0c…

靜態方法與實例方法的區別

靜態方法與實例方法的區別 1、靜態方法&#xff08;Static Methods&#xff09;1.1 調用方式1.2 訪問權限 2、實例方法&#xff08;Instance Methods&#xff09;2.1 調用方式2.2 訪問權限 3、總結 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1…

大數據面試題之數倉(2)

目錄 維度表和事實表的區別? 什么是ER模型? OLAP、OLTP解釋(區別)三范式是什么&#xff0c;舉些例子 維度設計過程&#xff0c;事實設計過程 維度設計中有整合和拆分&#xff0c;有哪些方法&#xff0c;并詳細說明 事實表設計分幾種&#xff0c;每一種都是如何在業…