并發多線程八股

并發多線程

  • 1.Java里面的線程和操作系統的線程一樣嗎?
  • 2.Java的線程安全在三個方面體現:
  • 3.保證數據一致性的方案
  • 4.線程創建的方式
    • 1)Thread類
    • 2)Runnable接口
    • 3)Callable接口和FutureTask
    • 4)線程池(executor框架)
  • 5.啟動一個線程
  • 6.停止一個線程
  • 7.Java線程的狀態有哪些
  • 8.sleep()和wait()的區別
  • 9.BLOCKED和WAITING的區別
  • 10.WAITING進入RUNNABLE的核心機制
  • 11.不同的線程之間如何通信
    • 1)修改共享變量
    • 2)等待通知機制
    • 3)同步輔助類
    • 4)計數信號量
  • 12.停止一個線程
  • 13.參考

1.Java里面的線程和操作系統的線程一樣嗎?

  • Java程序創建的線程和操作系統的線程是一對一的,java底層會調用pthread_create來創建線程。

2.Java的線程安全在三個方面體現:

  • 原子性:要么所有操作一起成功執行,要么一起失敗回滾(atomic包,synchronized關鍵字)。
  • 可見性:保證線程對內存的修改可以及時被其他線程看見(synchronized關鍵字,volatile關鍵字)。
  • 有序性:指程序執行順序符合預期,不會因為指令重排序后導致的亂序而出現錯誤(happens-before原則)。

3.保證數據一致性的方案

  • 事務管理ACID
  • 鎖機制(synchronized、ReentrantLock)
  • CAS樂觀鎖

4.線程創建的方式

1)Thread類

  • 繼承Thread類,重寫run(。
  • 優點:編程簡單,訪問當前線程無需使用Thread.currentThread(), 直接使用this即可獲取當前線程。
  • 缺點:繼承了Thread類就不能繼承其他父類。

2)Runnable接口

  • 實現Runnable接口,重寫run(),然后將runnable對象作為參數傳遞給Thread類的構造器;
  • 優點:
    • 還可以繼承其他類。
    • 多個線程共享同一個目標對象,適合多個相同線程來處理同一份資源的情況;
  • 缺點:編程稍復雜,訪問當前對象需使用Thread.currentThread()方法。

3)Callable接口和FutureTask

  • Callable接口類相較于Runnable,其有call()方法可以有返回值并且可以拋出異常。執行callable任務,需將它包裝進一個FutureTask,因為Thread類的構造器只接收Runnable參數,而FutureTask實現了Runnable接口。
  • 缺點:編程復雜,訪問當前線程需調用Thread.currentThread()。
  • 優點:
    • 可以繼承其他類。
    • 可以多個線程共享一個target對象,非常適合多線程處理同一份資源的情形。

4)線程池(executor框架)

  • 可以使用executors類的靜態方法創建不同類型的線程池。
  • 缺點:線程池增加了程序的復雜度。
  • 優點:
    • 線程重用,降低資源消耗。
    • 提高響應速度,因為線程池的線程是預先創建好的。
    • 提高系統穩定性,因為線程池可以限制并發線程數量。
    • 支持任務隊列存儲待執行的任務,避免任務丟失。

5.啟動一個線程

  • start(),線程會進入就緒狀態。

6.停止一個線程

  • interrupt()修改中斷狀態標志位為true,run()中判斷當前程序狀態,中斷狀態就拋出InterruptedException異常。
  • stop(),已棄用,清理工作不到位。
  • return停止線程,interrupt()修改中斷狀態標志位為true后,run()中判斷當前程序狀態,中斷狀態就return。

7.Java線程的狀態有哪些

  • 可以調用Thread中的getState()方法獲取當前線程狀態;
  • NEW:初始化狀態;
  • RUNNABLE:就緒狀態;
  • BLOCKED:阻塞狀態,一般是獲取鎖的時候進行阻塞;
  • WAITING:無時限等待狀態,一般是調用了wait()方法之后進行阻塞,正在等待另一個線程執行某些操作(如:notify());
  • TIME_WAITING:有時限等待狀態,一般是調用了sleep()方法后進行阻塞;
  • TERMINATED:終止狀態。

8.sleep()和wait()的區別

  • 分類不同,sleep()是Thread類的靜態方法,wait()是Object類的實例方法,wait()必須通過對象來調用;
  • sleep()線程不會釋放持有的對象鎖,但會主動讓出CPU時間片,時間結束自動進入就緒狀態,wait()線程會釋放持有的對象鎖,直到被其他線程調用相同對象的notify()喚醒;
  • sleep()可以在任意位置調用,無需事先獲取鎖。Wait()必須在synchronized 代碼塊內調用,即要求線程需持有該對象的鎖,否則拋出異常IllegalMonitorStateException

9.BLOCKED和WAITING的區別

  • BLOCKED是鎖競爭失敗后被動觸發的狀態;WAITING是人為的主動觸發的狀態。
  • BLOCKED的喚醒是其他線程釋放鎖后自動觸發的,WAITING必須通過特定方法來主動喚醒。

10.WAITING進入RUNNABLE的核心機制

  • 外部事件觸發
  • 資源可用性變化

11.不同的線程之間如何通信

1)修改共享變量

  • volatile關鍵字用于保證變量的可見性。當一個變量被聲明為volatile時,它會保證該變量的寫操作會立即刷新到主內存中,而讀操作會從主內存中讀取最新的值。

2)等待通知機制

  • Object類下的wait(),notify(),notifyAll();
  • LockSupport類下的park(),unpark()方法,喚醒指定線程;
  • Condition類下的await(),signal(),signalAll();
    • ReentrantLock是Lock接口的一個實現類,condition通過lock.newCondition()方法創建;
    • 可以創建多個等待集(存的是等待喚醒的對象),如:生產者、消費者,這樣可以實現生產者消費者互相喚醒。
import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class LockConditionExample {private static final Lock lock = new ReentrantLock();private static final Condition condition = lock.newCondition();public static void main(String[] args) {......}
}

3)同步輔助類

4)計數信號量

12.停止一個線程

  • 通過共享標志位主動終止(volatile關鍵字);
  • 中斷機制(Thread.interrupt());
  • 線程池的Future.cancel()停止線程(任務需通過線程池提交,且依賴中斷機制);
  • 不可中斷,則關閉資源。

13.參考

https://www.xiaolincoding.com/interview/juc.html#%E5%A4%9A%E7%BA%BF%E7%A8%8B

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

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

相關文章

VBA數據庫解決方案第二十講:SQL在VBA中幾種常見的表達方式

《VBA數據庫解決方案》教程(版權10090845)是我推出的第二套教程,目前已經是第二版修訂了。這套教程定位于中級,是學完字典后的另一個專題講解。數據庫是數據處理的利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法…

大語言模型智體的綜述:方法論、應用和挑戰(下)

25年3月來自北京大學、UIC、廣東大亞灣大學、中科院計算機網絡信息中心、新加坡南陽理工、UCLA、西雅圖華盛頓大學、北京外經貿大學、喬治亞理工和騰訊優圖的論文“Large Language Model Agent: A Survey on Methodology, Applications and Challenges”。 智體時代已經到來&a…

《STL 六大組件之容器篇:簡單了解 list》

目錄 一、list 簡介二、list 的常用接口1. 構造函數(constructor )2. 迭代器(iterator)3. 容量、修改和訪問(capacity 、modify and access) 一、list 簡介 簡單來說,list 就是數據結構初階中學…

nmslib 是一個 超快、適用于高維向量的最近鄰搜索庫,基于 HNSW 算法,被廣泛用于 語義搜索、推薦系統、人臉識別等任務

nmslib 是什么? nmslib(Non-Metric Space Library)是一個 高效的最近鄰搜索(ANN, Approximate Nearest Neighbor Search) 庫,專門用于 高維向量搜索,適用于 文本、圖像、語音等嵌入向量 的相似…

前端流式輸出實現詳解:從原理到實踐

前端流式輸出實現詳解:從原理到實踐 前言一、流式輸出核心原理1.1 什么是流式輸出?1.2 技術優勢對比1.3 關鍵技術支撐 二、原生JavaScript實現方案2.1 使用Fetch API流式處理關鍵點解析: 2.2 處理SSE(Server-Sent Events&#xff…

【STM32】最后一刷-江科大Flash閃存-學習筆記

FLASH簡介 STM32F1系列的FLASH包含程序存儲器、系統存儲器和選項字節三個部分,通過閃存存儲器接口(外設)可以對程序存儲器和選項字節進行擦除和編程,(系統存儲器用于存儲原廠寫入的BootLoader程序,用于串口…

梯度(Gradient)與步長(Step Size)

梯度(Gradient)與步長(Step Size) 梯度與步長是優化算法(如梯度下降法)的核心概念。以下是它們的詳細解釋: 梯度(Gradient) ?定義 梯度是一個向量,表示多元…

freecad二開 xmlrpc接口api qtgui

FreeCAD.ConfigGet("UserAppData") 文件夾下創建mod文件夾 mod文件夾底下創建插件文件夾my_server: freecad_server.py: from xmlrpc.server import SimpleXMLRPCServer import FreeCADGui import FreeCADimport queue from PySide2.QtCore import QTi…

鴻蒙NEXT開發日志工具類(ArkTs)

import hilog from ohos.hilog; import { JSON } from kit.ArkTS; import { BusinessError } from kit.BasicServicesKit; import { StrUtil } from ./StrUtil;/*** 日志工具類* author: 鴻蒙布道師* since: 2024/03/31*/ export class LogUtil {private static logSize: numbe…

《Linux運維總結:基于銀河麒麟V10+ARM64架構CPU源碼編譯部署單實例redis7.2.6》

總結:整理不易,如果對你有幫助,可否點贊關注一下? 更多詳細內容請參考:《Linux運維篇:Linux系統運維指南》 一、環境信息 環境信息如下: 主機IP 操作系統 Redis版本 CPU架構 192.168.1.111 K…

基于LSTM的文本分類1——模型搭建

源碼 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as npclass Config(object):"""配置參數類,用于存儲模型和訓練的超參數"""def __init__(self, dataset, embedding):self.…

小了 60,500 倍,但更強;AI 的“深度詛咒”

作者:Ignacio de Gregorio 圖片來自 Unsplash 的 Bahnijit Barman 幾周前,我們看到 Anthropic 嘗試訓練 Claude 去通關寶可夢。模型是有點進展,但離真正通關還差得遠。 但現在,一個獨立的小團隊用一個只有一千萬參數的模型通關了…

nextjs使用02

并行路由 同一個頁面,放多個路由,, 目錄前面加,layout中可以當作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…

github 無法在shell里鏈接

當我在shell端git push時,我發現總是22 timeout的問題。 我就進行了以下步驟的嘗試并最終得到了解決。 第一步,我先確定我可以curl github,也就是我網絡沒問題 curl -v https://github.com 如果這個時候不超時和報錯,說明網絡…

當前主流的大模型知識庫軟件對比分析

以下是當前主流的大模型知識庫軟件對比分析,涵蓋功能特性、適用場景及優劣勢,結合最新技術動態和行業實踐提供深度選型參考: 一、企業級智能知識庫平臺 1. 阿里云百煉(Model Studio) 核心能力:基于RAG技…

Java的比較器 Comparable 和 Comparator

在 Java 中,Comparable 和 Comparator 是用于對象排序的重要接口。它們提供了不同的排序方式,適用于不同的需求,同時在 Java 底層排序算法中發揮著關鍵作用。本文將從基礎概念、使用方法、排序實現(包括升序、降序)、底…

基于Qlearning強化學習的太赫茲信道信號檢測與識別matlab仿真

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1 太赫茲信道特性 2.2 Q-learning強化學習基礎 2.3 基于Q-learning 的太赫茲信道信號檢測與識別系統 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2024b仿真結果如下(完整代碼運行后無水印…

力扣刷題————199.二叉樹的右視圖

給定一個二叉樹的 根節點 root,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。 示例 1: 輸入:root [1,2,3,null,5,null,4] 輸出:[1,3,4] 解題思路:我們可以想到這…

文件包含漏洞的小點總結

文件本地與遠程包含: 文件包含有本地包含與遠程包含的區別:本地包含只能包含服務器已經有的問題; 遠程包含可以包含一切網絡上的文件。 本地包含: ①無限制 感受一下使用phpstudy的文件上傳,開啟phpstudy的apache…

深度學習處理時間序列(5)

Keras中的循環層 上面的NumPy簡單實現對應一個實際的Keras層—SimpleRNN層。不過,二者有一點小區別:SimpleRNN層能夠像其他Keras層一樣處理序列批量,而不是像NumPy示例中的那樣只能處理單個序列。也就是說,它接收形狀為(batch_si…