持續總結中!2024年面試必問 100 道 Java基礎面試題(四十五)

上一篇地址:持續總結中!2024年面試必問 100 道 Java基礎面試題(四十四)-CSDN博客

八十九、在Java中,什么是線程局部變量(ThreadLocal變量)?

在Java中,ThreadLocal變量是一種特殊的變量,它為每個線程提供了一個獨立副本的變量。當一個線程訪問通過ThreadLocal對象發布的變量時,它實際上是訪問該變量在當前線程的副本,而不是共享的原始副本。這種方式可以避免在多線程環境下的同步問題,因為每個線程只操作自己的數據副本。

線程局部變量的主要特點:

  1. 線程隔離:每個線程通過ThreadLocal訪問到的變量是隔離的,互不影響。

  2. 存儲機制ThreadLocal內部使用ThreadLocalMap來存儲每個線程的局部變量副本。這個映射是線程私有的,鍵是ThreadLocal對象,值是線程局部變量的副本。

  3. 內存泄漏:由于ThreadLocalMap的生命周期與線程相同,如果ThreadLocal對象被回收,但是ThreadLocalMap中仍然有對它的引用,就可能導致內存泄漏。因此,通常推薦在使用完ThreadLocal后調用remove()方法來清除線程局部變量。

  4. 初始值:可以通過ThreadLocalwithInitial方法提供初始值函數,為每個線程的局部變量提供初始值。

  5. 更新和訪問:線程可以通過調用set(T value)方法來更新自己的局部變量副本,通過get()方法來訪問自己的副本。

使用場景:

  1. 線程特定的配置:當需要為每個線程提供特定的配置信息時,可以使用ThreadLocal來存儲這些信息。

  2. 用戶會話信息:在web應用中,可以為每個用戶請求創建一個線程局部的用戶會話對象,存儲用戶信息。

  3. 線程安全的單例:可以利用ThreadLocal實現線程安全的單例模式,每個線程都有自己的單例實例。

  4. 數據庫連接和事務管理:在某些情況下,可以將數據庫連接或事務管理對象存儲在ThreadLocal中,確保每個線程使用自己的數據庫連接。

示例代碼:

public class ThreadLocalExample {private static final ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "default value");public static void main(String[] args) {// 線程1new Thread(() -> {threadLocal.set("value for thread 1");System.out.println("Thread 1: " + threadLocal.get());}).start();// 線程2new Thread(() -> {threadLocal.set("value for thread 2");System.out.println("Thread 2: " + threadLocal.get());}).start();}
}

在這個示例中,兩個線程各自設置了ThreadLocal變量的值,并且只能訪問到自己的值,互不影響。

注意事項:

  • 由于ThreadLocal變量是線程私有的,因此它們不能被synchronizedReentrantLock等同步機制保護,因為它們不存在線程間的競爭條件。
  • 使用ThreadLocal時,要注意內存泄漏的問題,尤其是在線程池中,因為線程可能會復用,而ThreadLocal變量如果沒有及時清理,可能會導致長時間占用內存。
  • 在使用ThreadLocal時,應該盡量在不需要時及時移除對應的線程局部變量,以避免潛在的內存泄漏風險。

ThreadLocal為多線程環境中的變量隔離提供了一種簡單而高效的方式,但在使用時也需要考慮到內存泄漏等潛在問題。

九十、如何實現Java程序的并發執行?

在Java中實現并發執行主要涉及以下幾個方面:

1. 線程(Thread)

線程是實現并發執行的基本單位。在Java中,可以通過繼承Thread類或實現Runnable接口來創建線程。

  • 繼承Thread類:創建一個類繼承Thread類,并重寫run()方法。
class MyThread extends Thread {public void run() {// 線程執行的代碼}
}// 實例化并啟動線程
MyThread t = new MyThread();
t.start();
  • 實現Runnable接口:創建一個類實現Runnable接口,并實現run()方法。
class MyRunnable implements Runnable {public void run() {// 線程執行的代碼}
}// 使用Thread類創建線程并啟動
Thread t = new Thread(new MyRunnable());
t.start();

2. 線程池(ThreadPool)

線程池用于管理線程資源,它可以有效地控制并發執行的線程數量,提高性能,并減少系統資源的消耗。

  • Executor框架:Java提供了java.util.concurrent包,其中包含了Executor框架,用于創建和管理線程池。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;ExecutorService executor = Executors.newFixedThreadPool(10); // 創建一個固定大小的線程池
executor.submit(() -> {// 并發執行的任務
});
executor.shutdown(); // 關閉線程池

3. 同步(Synchronization)

在多線程環境下,為了避免線程間的數據競爭和狀態不一致,需要使用同步機制。

  • 同步代碼塊:使用synchronized關鍵字來同步一段代碼塊。
synchronized (obj) {// 需要同步的代碼
}
  • 同步方法:在方法聲明中使用synchronized關鍵字,使整個方法成為同步方法。
public synchronized void myMethod() {// 方法體
}

4. 并發集合(Concurrent Collections)

Java提供了一組線程安全的集合類,位于java.util.concurrent包中,如ConcurrentHashMapConcurrentLinkedQueue等。

import java.util.concurrent.ConcurrentHashMap;ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value"); // 線程安全的put操作

5. 并發工具類(Concurrent Utilities)

Java提供了一些并發工具類,如CountDownLatchCyclicBarrierSemaphore等,用于控制并發流程。

  • CountDownLatch:允許一個或多個線程等待一組事件的發生。
CountDownLatch latch = new CountDownLatch(1);
// 線程執行任務
latch.countDown(); // 事件完成,減少計數
latch.await(); // 等待事件完成

6. 原子變量(Atomic Variables)

Java提供了一組原子變量類,如AtomicIntegerAtomicLong等,它們利用CAS(Compare-And-Swap)操作來實現線程安全的變量更新。

import java.util.concurrent.atomic.AtomicInteger;AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子地增加并返回當前值

7. 鎖(Locks)

java.util.concurrent.locks包提供了更強大的鎖機制,如ReentrantLock

import java.util.concurrent.locks.ReentrantLock;ReentrantLock lock = new ReentrantLock();
lock.lock(); // 獲取鎖
try {// 受保護的代碼
} finally {lock.unlock(); // 釋放鎖
}

8. 并發異常處理

在編寫并發程序時,需要特別注意異常處理,以避免線程因為未捕獲的異常而意外終止。

Thread t = new Thread(() -> {try {// 可能拋出異常的代碼} catch (Exception e) {// 異常處理}
});
t.start();

9. 并發設計模式

合理應用并發設計模式,如生產者-消費者模式、讀寫鎖模式等,可以簡化并發程序的邏輯,提高代碼的可讀性和可維護性。

實現Java程序的并發執行是一個復雜的過程,需要綜合考慮資源管理、線程安全、性能優化等多個方面。正確使用Java提供的并發工具和機制,可以有效地提高程序的并發性能和穩定性。

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

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

相關文章

企業微信hook接口協議,ipad協議http,發送鏈接的方式邀請成員進群

發送鏈接的方式邀請成員進群 參數名必選類型說明uuid是String每個實例的唯一標識&#xff0c;根據uuid操作具體企業微信 請求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","roomid":10696052955013729, "vids":[788130334…

Flutter 中的 CircleAvatar 小部件:全面指南

Flutter 中的 CircleAvatar 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CircleAvatar 是一個用于顯示頭像的圓形控件&#xff0c;通常包含一個圖標、圖片或者一個簡單的文本字符。它在設計上與 Material Design 指南中的頭像規范相匹配&#xff0c;常用于展示用戶信…

C# 常用匯總

時間處理 public static class DateTimeHelper{/// <summary>/// 獲取當前時間戳&#xff08;Unix時間戳&#xff09; /// </summary>/// <returns></returns>public static long GetCurrentUnixTimestamp(){DateTimeOffset offset DateTimeOffset.…

Qt---文件系統

一、基本文件操作 1. QFile對文件進行讀和寫 QFile file( path 文件路徑) 讀&#xff1a; file.open(打開方式) QlODevice::readOnly 全部讀取->file.readAll()&#xff0c;按行讀->file.readLine()&#xff0c;atend()->判斷是否讀到文件尾 …

Java網絡編程基礎

Java網絡編程基礎主要涉及進程間通信、網絡通信協議、IP地址和端口以及Java提供的網絡應用編程接口等核心概念。 進程間通信是Java網絡編程的基礎。進程是運行中的程序&#xff0c;而進程間通信則是指不同進程之間進行數據交換和共享信息的過程。在Java中&#xff0c;進程間的…

STM32存儲左右互搏 USB接口FATS文件讀寫U盤

STM32存儲左右互搏 USB接口FATS文件讀寫U盤 STM32的USB接口可以例化為Host主機從而對U盤進行操作。SD卡/MicroSD/TF卡也可以通過讀卡器轉換成U盤使用。這里介紹STM32CUBEIDE開發平臺HAL庫實現U盤FATS文件訪問的例程。 USB接口介紹 常見的USB接口電路部分相似而有不同的連接器…

K8S -----二進制搭建 Kubernetes v1.20

目錄 一、準備環境 1.1 修改主機名 1.2 關閉防火墻&#xff08;三臺一起&#xff0c;這里只展示master01&#xff09; 1.3 在master添加hosts&#xff08;依舊是三臺一起&#xff09; 1.4 調整內核參數并開啟網橋模式 二、部署docker引擎 三、部署 etcd 集群 1.在mast…

15.JUC原子類

文章目錄 JUC原子類1.JUC中的Atomic原子操作包1.1. 基本原子類&#xff08;Basic Atomic Classes&#xff09;1.2. 數組原子類&#xff08;Array Atomic Classes&#xff09;1.3. 引用原子類&#xff08;Reference Atomic Classes&#xff09;4. 字段更新原子類&#xff08;Fie…

StackQueue+泛型簡單理解

&#x1f341; 個人主頁&#xff1a;愛編程的Tom&#x1f4ab; 本篇博文收錄專欄&#xff1a;Java專欄&#x1f449; 目前其它專欄&#xff1a;c系列小游戲 c語言系列--萬物的開始_ &#x1f389; 歡迎 &#x1f44d;點贊?評論?收藏&#x1f496;三連支持一…

ddpm Denoising Diffusion Probabilistic Model 學習筆記

目錄 Stable Diffusion 文章的貢獻抽象出來就兩個 潛空間上做擴散生成 ddpm(Denoising Diffusion Probabilistic Model)學習筆記 算法原理 unet預測噪聲 unet推理過程 重參數化技巧 &#xff08;1&#xff09;利用前一時刻的 xt-1 得到任意時刻的噪聲圖片 xt&#xff…

LeetCode2215找出兩數組的不同

題目描述 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;請你返回一個長度為 2 的列表 answer &#xff0c;其中&#xff1a;answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整數組成的列表。answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整數組…

Linux poweroff命令教程:如何實現一鍵關機(附實例詳解和注意事項)

Linux poweroff命令介紹 poweroff命令是用來關閉系統的。當你執行這個命令時&#xff0c;它會發送一個信號給系統&#xff0c;告訴系統關閉所有的進程&#xff0c;然后關閉系統。這個命令非常有用&#xff0c;特別是在你需要遠程關閉系統&#xff0c;或者你的系統沒有圖形用戶…

Autosar架構

藍框那種叫component&#xff0c;綠框的叫function cluster。 接口 有三種接口&#xff0c;RTE跟SWC之間鏈接的叫Autosar Interface&#xff0c;RTE跟BSW的Components鏈接是Standardized Interface&#xff0c;RTE跟BSW的services鏈接的是Standardized Autosar Interface。 St…

項目部署到線上proxytable代理失效nginx報404的問題

我的項目是在vue的config文件夾中的index.js中配置了接口地址 &#xff0c;本地跑的時候都能訪問&#xff0c;放到線上就報404&#xff1b; module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: {/xxx: {target: http://xxxxxxxx:xxx…

分享四種CAD圖紙加密方法,嚴防盜圖

在數字化時代&#xff0c;cad圖紙的盜用和非法傳播問題日益突出。對于企業和設計師來說&#xff0c;保護設計成果的安全性和原創性&#xff0c;采取有效的cad加密方法至關重要。本文將分享四種cad加密方法&#xff0c;幫助您嚴防盜圖&#xff0c;保護圖紙安全。 使用cad軟件內…

網絡協議的分類

1.概要 網絡協議可以分為三類&#xff1a; 封裝協議路由協議功能類協議 2.分類說明 OSPF報文直接調用_ IP協議__協議進行封裝&#xff0c;以目的地址_244.0.0.5 __發送到所有的OSPF路由器? 244.0.0.1 所有主機&#xff1b;244.0.0.2 所有路由器&#xff1b;244.0.0.6 指定…

【前端每日一題】day5

JS 實現繼承的幾種方式 在JavaScript中&#xff0c;實現繼承的幾種方式包括原型鏈繼承、構造函數繼承、組合繼承、原型式繼承、寄生式繼承和組合式繼承。 原型鏈繼承&#xff1a; function Parent() {this.name Parent; } Parent.prototype.sayHello function() {console.…

當它還是幼生期的時候,及早離開它!

當我們有豐富的精神生活時&#xff0c;充實的知識吸收儲備時&#xff0c;為自己的每一點進步而欣慰時&#xff0c;我們就不會有失敗的憂慮。也不會有孤單的自憐。 沒有人是弱者&#xff0c;每個人都有自己活著的方式&#xff0c;當你內心強大時&#xff0c;你會尊重每一個“弱者…

Vue+springboot的批量刪除功能

vue前臺 <div style"margin-bottom: 10px"><el-button type"primary" plain click"handleAdd">新增</el-button><el-button click"delBatch" type"danger" plain style"margin-left: 5px"…

Spring Cloud 背后技術詳解

Spring Cloud 是基于 Spring Boot 的一套微服務架構解決方案。它為開發者提供了一系列的工具&#xff0c;用于快速構建分布式系統中的一些常見模式&#xff08;例如配置管理、服務發現、斷路器等&#xff09;。Spring Cloud 利用 Spring Boot 的自動配置和獨立運行能力&#xf…