java八股之并发编程
1.java线程和操作系统线程之间的区别?
现在java线程本质上是操作系统线程,java中采用的是一对一的线程模型(一个用户线程对应一个内核进程)
2.什么是进程和线程?
1.进程是操作系统一次执行,资源分配和调度的基本单位,有独立的内存和资源,创建和销毁的开销大,进程之间相互独立
2.线程是进程内部的执行单位,是CPU调度的基本单位,可以共享进程的资源。
3.同一个进程内的线程共享堆和方法区的资源
4.每个线程都有自己的程序计数器,虚拟机栈和本地方法栈
3.程序计数器为什么是私有的?
1.程序计数器依次读取指令,实现代码的控制,用于记录当前线程执行的位置,线程切换后他才能恢复到正确的执行位置
4.虚拟机栈和本地方法栈为什么是私有的?
1.虚拟机栈:在java方法执行之前会创建一个栈帧用于存储局部变量表,操作数栈等。从方法调用到执行完成的过程,对应栈帧中入栈和出栈的过程
2.本地方法帧,功能和虚拟机栈相似,但是用到了Native方法
总结:保证线程局部变量不被别的线程访问到。
5.为什么存在JVM?
1.java程序被编译成了字节码.class文件,JVM可以在不同的操作系统或平台上运行这些字节码,不同的平台有不同的JVM实现,它屏蔽了底层操作系统和硬件的差异,使得java程序实现了“一次编写,到处运行”的特性
6.介绍下堆和方法区之间的区别?
1.堆主要用于存储对象实例和数组,是所有线程共享的。方法区存储类中的常量,静态变量等
2.堆内存的分配是动态的,当创建新的对象时候,堆就会为其分配内存空间。方法区的内存分配在类的加载时进行,当类被加载到JVM时,常量池信息就会加载到方法区
7.创建线程的方式
1.继承Thread类,实现Runnable接口和实现Callable接口
8.说说线程的生命周期和状态?
1.NEW:初始状态,线程被创建但是没有调用start()方法
2.RUNNABLE:运行状态,线程调用了start()方法
3.BLOCKED:阻塞状态,等待锁释放
4.WATING:等待状态,等待其他线程执行后
5.TIME_WATING:超时等待状态,可以在指定时间后自行返回
6.TERMINATED:终止状态,线程已运行完毕
9.什么是线程的上下文切换
1.线程在执行的过程中会有自己的运行条件和状态(上下文)。当发生线程切换的时候,如主动让出CPU,时间片用完,IO操作,这个时候需要保存上下文信息,方便下次回复现场,这就是所谓的上下文切换。
10.sleep方法和wait方法的对比
1.共同点:都可以暂停线程的执行
2.区别:sleep没有释放锁,wait释放锁。
wait一般用于线程之间的交互,sleep通常用于暂停线程的执行。wait方法需要调用notify苏醒,或者设置超时时间,sleep一般执行完成,自动苏醒
11.为什么wait方法不定义在Thread中?
wait是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁,每个对象都有对象锁,因此操作的是对象Object而不是Thread。
sleep方式只是让当前线程暂停执行,不涉及到对象,所以在Thread中
12.可以直接调用Thread类的run方法吗?
new Thread线程进入新建状态,调用start方法进行就绪状态,等分配到时间片开始运行,自动执行run方法的内容。如果直接执行run方法,会把run方法当作main线程下的普通方法执行,并不会在线程执行
13.为什么要使用多线程?
线程是程序执行的最小单位,线程间切换的开销远小于进程。并且现在电脑都是多CPU,可以多个线程同时运行。多线程是高并发的基础,可以提升系统的并发能力
14.单核CPU支持JAVA多线程吗?
支持,单核CPU通过时间片轮转的方式分配给不同的线程使用,一个CPU一次只能执行一个任务,但可以在多个线程之间快速切换,感觉上是一起工作
15.单核CPU上运行多个线程效率一定高吗?
如果是CPU密集型,频繁的线程切换开销会导致效率降低
IO密集型,CPU可以充分利用IO等待时间,可以提高效率
16.产生死锁的必要条件
1.互斥条件:该资源任意一个时刻只能由一个线程占用
2.请求与保持条件:线程请求资源阻塞时,对持有的资源不释放
3.不剥夺条件:对于获得的资源没使用完不能被其他线程强行剥夺,只有使用完才释放资源
4.循环等待:循环等待对方手里的资源
17.如何避免死锁:
1.破坏请求和保持:一次性申请所有资源
2.破坏不剥夺:主动释放资源
3.破坏循环等待:按序分配资源
18.Synchronized和Lock区别
1,Synchronized是内置的java关键字,Lock是一个Java类
2.synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
3.Synchronized会自动释放锁,Lock必须要手动释放锁!否则死锁
4.synchronized线程1获得锁,线程2 只能傻傻的等待
19.什么叫做可重入锁
1.指的是同一个线程再持有锁的情况下,多次获取该锁不会被阻塞
2.可重入锁内部维护了一个计数器,当线程第一次获取锁时,计数器会被设置为1,如果该线程再次请求同一把锁,计数器会递增。当线程释放锁时,只有计数器的值变为0,锁才会被完全释放,此刻其他线程才有机会获得该锁。
20.如何理解生产者和消费者问题synchronized
1 判断等待—业务—通知三个流程
2.资源类和线程分开
3.多生产多消费情况下,判断要通过while循环判断,防止虚假唤醒问题,if只会执行一次
21.JUC版生产者和消费者
lock替代synchronized
condition.await替换wait,condition.signalAll()替换notify
可以精准通知线程唤醒,设置对应的同步监视器
22.8锁问题
1,synchronized锁的对象是方法的调用者,谁先调用谁就先拿到锁
2.普通方法优先于同步方法先执行
3.带了static的方法,锁的是class对象,一个类只有全局唯一的class对象
23.List线程不安全的解决方案
- 使用vector实现类
2.使用Collections.synchronized(new ArrrayList<>())
3.new CopyOnWriteArrayList<>();
4.如果不适用上述方法,可能出现CocurrentModifiationArrrayList
5.CopyOnWriteArrayList使用lock锁,vector内部采用的是synchronized锁
24.hashset的底层是什么?
底层就是用的hashmap的key的唯一性,使得set不重复
25.多线程的第三种创建方式:实现Callable接口
psvm {MyThread thread = new MyThread();FutureTask futureTask = new FutureTask(thread);new Thread(futureTask "A").start();Integer o = (Integer)futureTask.get(); // 获取返回值sout(o);
}class MyThread implements Callable<Integer> {@overridepublic Integer call(){return 1024;}
}
把线程丢到FutureTask中,futertask丢到启动类中
26.CounterDownLatch
counterDownLatch.countDown(); //数量-1
countDownLatch.await(); // 等待计数器归零,然后再向下执行
27.CylicBarrier
CylicBarrier cylicBarrier = (new CylicBarrier(7, ()->{sout(“成功”)})
cylicBarrier.await() 计数器加一,等待线程执行结束,输出成功
类似于一个加法计数器
28.Semaphore信号量
Semaphore semaphore = new Sephore(3);
semaphore.acquire(); // 获取信号量,如果已满,等待被释放,信号量-1
semaphore.release(); // 释放信号量,信号量+1
多个共享资源的互斥使用
29.ReadWriteLock
1.写入保证原子性,必须保证有序。读线程可以随机读取,多个线程可以同时占有
独占锁(写锁):一次只能被一个线程占有
共享锁(读锁):多个线程同时占有
30.线程池
程序运行的本质:占用系统资源!为了优化资源的使用,引入了线程池
池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我
线程池的好处:降低资源的消耗,提高响应的速度,方便管理
相关文章:
java八股之并发编程
1.java线程和操作系统线程之间的区别? 现在java线程本质上是操作系统线程,java中采用的是一对一的线程模型(一个用户线程对应一个内核进程) 2.什么是进程和线程? 1.进程是操作系统一次执行,资源分配和调度的…...
Qt 入门 5 之其他窗口部件
Qt 入门 5 之其他窗口部件 本文介绍的窗口部件直接或间接继承自 QWidget 类详细介绍其他部件的功能与使用方法 1. QFrame 类 QFrame类是带有边框的部件的基类。它的子类包括最常用的标签部件QLabel另外还有 QLCDNumber、QSplitter,QStackedWidget,QToolBox 和 QAbstractScrol…...
Linux系统之----冯诺依曼结构
1.简要描述 冯诺依曼体系结构是现代计算机的基本设计思想,其核心理念是将计算机的硬件和软件统一为一个整体,通过存储程序的方式实现计算。冯诺依曼体系结构的核心思想是通过存储程序实现自动计算,其五大部件协同工作,奠定了现代…...
C++11新特性
目录 引入 C11新特性 统一的初始化列表 一切皆可{}初始化 std::initializer_list 统一的声明 auto decltype nullptr 范围for STL新增容器 STL新增容器接口 左值引用和右值引用 左值和右值 左值引用和右值引用 右值引用的优势(移动语义) 右值引用的使用场景 …...
492Q 型气缸盖双端面铣削组合铣床总体设计
一、引言 492Q 型气缸盖是发动机的重要组成部分,其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床,能够提高加工效率和质量,满足发动机生产的需求。 二、总体设计要求 加工精度&…...
《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式
目录 一、关系代数 基本运算 笛卡尔积() 投影(π) 选择(σ) 自然连接(⋈) 真题示例: 二、函数依赖 基本概念 Armstrong公理系统 键与约束 三、范式ÿ…...
IO流(二)
一、字符流 使用字节流可以读取文件中的字节数据。但是如果文件中有中文使用字节流来读取,就有可能读到半个汉字的情况,这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码,但是如果文件过大又不太合适。 所以Java专门为我们提供了另…...
#Linux动态大小裁剪以及包大小变大排查思路
1 动态库裁剪 库分为动态库和静态库,动态库是在程序运行时才加载,静态库是在编译时就加载到程序中。动态库的大小通常比静态库小,因为动态库只包含了程序需要的函数和数据,而静态库则包含了所有的函数和数据。静态库可以理解为引入…...
天梯赛数据结构合集
1.集合操作:PTA | 程序设计类实验辅助教学平台 主要是注意set的取交集操作,AC代码: #include<bits/stdc.h> using namespace std; int n,m,k; set<int> a[60]; int main(){cin>>n;for(int i1;i<n;i){cin>>m;for…...
pdfjs库使用记录1
import React, { useEffect, useState, useRef } from react; import * as pdfjsLib from pdfjs-dist; // 设置 worker 路径 pdfjsLib.GlobalWorkerOptions.workerSrc /pdf.worker.min.js; const PDFViewer ({ url }) > { const [pdf, setPdf] useState(null); const […...
LIMS引领综合质检中心数字化变革,赋能质量强国战略
在质量强国战略的深入推进下,我国综合质检机构迎来了前所未有的发展机遇,同时也面临着诸多严峻挑战。随着检测领域从传统的食品药品监督向环境监测、新材料检测等新兴领域不断拓展,跨领域协同管理的复杂度呈指数级增长。作为提升产品质量的关…...
MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418
MySQLRedis实战教程:从Docker安装部署到自动化备份与数据恢复 一、前言 在企业应用中,对MySQL和Redis运维的要求越来越高: 不能仅是启动就算部署运行稳定、隔离、访问控制、备份恢复、安全可靠,才是 企业级的基本功能 本文将手…...
嵌入式音视频开发指南:从MPP框架到QT实战全解析
嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...
如何使用Python进行自动化的系统管理?
Python已经成为系统管理员最流行的编程语言之一,因为它简单、灵活,并且广泛支持各种系统管理任务。无论您是自动执行重复性任务,管理文件和目录,还是处理用户权限,Python都提供了一组强大的工具来简化您的工作流程。 …...
拆机装机,通电主板亮灯风扇不转无法开机解决办法
电源开机线 重启线 usb耳机模块 灯线 看来电源没问题 参考https://zhidao.baidu.com/question/83939532/answer/2321171868.html 买了个新主板过几天到看看会不会好...
IntelliSense 已完成初始化,但在尝试加载文档时出错
系列文章目录 文章目录 系列文章目录前言一、原因二、使用步骤 前言 IntelliSense 已完成初始化,但在尝试加载文档时出错 File path: E:\QtExercise\DigitalPlatform\DigitalPlatform\main\propertyWin.ui Frame GUID:96fe523d-6182-49f5-8992-3bea5f7e6ff6 Frame …...
SuperMap iClient3D for WebGL 如何加载WMTS服务
在 SuperMap iClient3D for WebGL 中加载WMTS服务时,参数配置很关键!下面我们详细介绍如何正确填写参数,确保影像服务完美加载。 一、数据制作 对于上述视频中的地图制作,此处不做讲述,如有需要可访问:Onl…...
[密码学实战]基于Python的国密算法与通用密码学工具箱
引言 在当今数字化浪潮中,信息安全已成为个人隐私保护与商业机密守护的核心议题。作为一位在密码学领域深耕多年的技术实践者,我深谙密码学工具在构建数字安全防线中的关键作用。正是基于这份认知与责任,我倾力打造了一款全方位、高性能的密…...
[密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案
[密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案 引言 国密算法(SM2/SM3/SM4)在金融、政务等领域广泛应用,但开发者在集成gmssl库实现SM2签名时,常遇到与第三方工具(如OpenSSL、国密网关)验证不…...
LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, stream 流操作
LIB-ZC, 一个跨平台(Linux)平台通用C/C扩展库, stream 流操作 lib-zc 封装了流操作命名空间 zcc基础类 stream(基类), iostream(io流封装) class stream 介绍 连接相关 // 都是虚函数, 为 iostream 等做准备virtual inline bool connect(const char *destination) { return …...
从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅
大家好呀!今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼,别担心!我会用最通俗易懂的方式,带你从main()方法开始,一步步揭开Spring Boot的…...
概率多假设跟踪(PMHT):多目标跟踪中的概率软关联与高效跟踪算法解析
一、PMHT 的起源与核心定位 (一)背景 在多目标跟踪中,传统算法面临以下瓶颈: JPDA:单帧局部最优关联,无法处理跨帧长时间断联,且假设目标数固定(如雷达跟踪中预设目标数范围&…...
4.信号和槽|存在意义|信号和槽的连接方式|信号和槽断开|lambda表达式|信号和槽优缺点(C++)
信号和槽存在意义 所谓的信号槽,终究要解决的问题,就是响应用户的操作 信号槽,其实在GUI开发的各种框架中,是一个比较有特色的存在 其他的GUI开发框架,搞的方式都要更简洁一些~~ 网页开发 (js dom api) 网…...
电脑 BIOS 操作指南(Computer BIOS Operation Guide)
电脑 BIOS 操作指南 电脑的BIOS界面(应为“BIOS”)是一个固件界面,允许用户配置电脑的硬件设置。 进入BIOS后,你可以进行多种设置,具体包括: 1.启动配置 启动顺序:设置从哪个设备启动&#x…...
Scrapeless Scraping Browser: A high-concurrency automation solution for AI
介绍:升级无缝抓取浏览器的并发能力 作为 Scrapeless 的开发者和创始团队,我们对人工智能自动化的未来充满真诚的热情。我们的使命是创建一个真正为 AI 设计的自动化浏览器。在过去的几年中,从 Browserless.io 到众多云服务供应商推出的“浏…...
Java项目—— 拼图小游戏(进阶版)
项目需求 在拼图小游戏基础版的基础上,完成下列要求: 一、实现更换拼图图片功能 1,给美女,动物,运动菜单按钮添加单击事件(动作监听) 2,当我们点击了美女之后,就会从13…...
解析:深度优先搜索、广度优先搜索和回溯搜索
一、深度优先搜索(DFS) 1. 原理 思想:从起始节点出发,顺着一条路径不断深入,直到到达目标或无路可走,然后回溯到最近的分支点,继续探索其他分支。 应用场景:路径查找、连通性检测、…...
探索大语言模型(LLM):循环神经网络的深度解析与实战(RNN、LSTM 与 GRU)
一、循环神经网络(RNN) 1.1 基本原理 循环神经网络之所以得名,是因为它在处理序列数据时,隐藏层的节点之间存在循环连接。这意味着网络能够记住之前时间步的信息,并利用这些信息来处理当前的输入。 想象一下…...
从零开始开发 MCP Server
作者:张星宇 在大型语言模型(LLM)生态快速演进的今天,Model Context Protocol(MCP)作为连接 AI 能力与真实世界的标准化协议,正逐步成为智能体开发的事实标准。该协议通过定义 Resources&#…...
Oracle日志系统之重做日志和归档日志
Oracle日志系统之重做日志和归档日志 重做日志归档日志 本文讨论Oracle日志系统中对数据恢复非常重要的两个日志:重做日志和归档日志。 重做日志 重做日志,英文名Redo Log,顾名思义,是用来数据重做的,主要使用场景是事…...
嵌入式开发--STM32G4系列硬件CRC支持MODBUS和CRC32
需求 在项目中,需要用到MODBUS CRC16校验,也要用到CRC32的校验,出于效率的考虑,准备用硬件CRC。 CRC 16的参数模型有很多种,我这里用的是MODBUS,对于不同的参数模型,会有不同的参数设置和初值&a…...
基于尚硅谷FreeRTOS视频笔记——4—多任务处理
目录 多任务处理 任务调度 任务的调度策略 优先级不同 优先级相同 多任务处理 通俗来讲就是 能够在同一时间 同时 进行多个任务的处理,这就时多任务处理。 但是,单核处理器一次只能处理一个任务,就是说在while中,任务们只能…...
中小型及初创企业如何实现数字化转型?
在当今动态的商业环境中,财务团队开始肩负起推动企业数字化转型的重任,即从传统的财务规划系统稳步迈向基于商业智能平台和以创新技术为驱动的解决方案领域。这些举措有望提高运营和分析效率,同时依托数据驱动的决策机制,帮助企业…...
java输出、输入语句
先创建一个用于测试的java 编写程序 #java.util使java标准库的一个包,这里拉取Scanner类 import java.util.Scanner;public class VariableTest {public static void main(String[] args) {#创建一个 Scanner 对象Scanner scanner new Scanner(System.in);System.…...
Python基础知识语法归纳总结(数据类型-1)
Python基础知识&语法归纳总结(数据类型) 一、Python基本数据类型 尤其注意,Python中的变量不需要特定的去声明,每个变量在使用前都必须对其进行赋值,它没有类型,我们所说的“类型”是变量所指的内存中对…...
Spring数据访问全解析:ORM整合与JDBC高效实践
目录 一、Spring ORM集成深度剖析 🌟 ORM模块架构设计 核心集成特性: 整合MyBatis示例配置: 二、Spring JDBC高效实践指南 🌟 传统JDBC vs Spring JDBC对比 🌟 JdbcTemplate核心操作示例 批量操作优化…...
哪种电脑更稳定?Mac?Windows?还是云电脑? 实测解密
随着科技的发展进步,电脑已成为当下各类群体的必备产品之一,它的妙用有很多,无论是学生党、打工人还是已经退休的人群或都离不开它的存在。然而,电脑虽好却也差异很大、不同品牌、不同系统、不同配置、不同价位的统统都会有区别。…...
【AI模型学习】关于写论文——论文的审美
文章目录 一、“补丁法”(Patching)1.1 介绍1.2 方法论1.3 实例 二、判断工作的价值2.1 介绍2.2 详细思路2.3 科研性vs工程性 三、novelty以及误区3.1 介绍3.2 举例 看了李沐老师的读论文系列后,总结三个老师提到的有关课题研究和论文写作的三…...
【面经】杭州产链数字科技一面
1.介绍一下自己 面试官您好!我叫***,目前是就读于****计算机科学与技术专业的一名学生。我平时在学校也自学了编程相关的知识,比如Java基础、Springboot、SpringCloud,关系型数据库Mysql,非关系型数据库Redisÿ…...
微信小程序调用yolo目标检测模型
目录 后端 前端微信小程序 完整代码 后端 利用Flask,调用目标检测模型,后端代码如下。 # flask_yolo.py from flask import Flask, request, jsonify from ultralytics import YOLO from PIL import Imageapp Flask(__name__) model_path best.p…...
vmware17 虚拟机 ubuntu22.04 桥接模式,虚拟机无法接收组播消息
问题描述: 在一个项目中,宿主机win10中,使用的vmware17pro 虚拟机安装的ubuntu22.04,按照网上的教程使用Qt绑定组播消息,在另外一个Ubuntu工控机上发送用wiresahrk抓包的组播消息 sudo tcpreplay -i enp1s0 --loop0 y…...
Kaggle-Bag of Words Meets Bags of Popcorn-(二分类+NLP+Bert模型)
Bag of Words Meets Bags of Popcorn 题意: 有很多条电影评论记录,问你每一条记录是积极性的评论还是消极性的评论。 数据处理: 1.首先这是文件是zip形式,要先解压,注意sep ‘\t’。 2.加载预训练的 BERT 分词器 …...
数字信号处理技术架构与功能演进
数字信号处理(DSP)是通过数字运算实现信号分析、变换、滤波及调制解调的技术领域,其发展过程与技术应用如下: 一、定义与核心功能 技术定义:通过算法将模拟信号转换为数字形式进行处理,具有高精度、可编程…...
IaaS架构剖析、场景实践
一、什么是 IaaS 1.1 定义 Infrastructure as a Service(IaaS,基础设施即服务)是一种按需、弹性提供计算、存储、网络和安全等底层 IT 资源的云服务模式。用户通过 API、CLI 或 Web 控制台即可在几分钟内创建、扩容或释放资源,而…...
国产之光DeepSeek架构理解与应用分析02
本专栏 国产之光DeepSeek架构理解与应用分析-CSDN博客 国产之光DeepSeek架构理解与应用分析02-CSDN博客 前置的一些内容理解 GPU TPU NPU的区别? 设计目的 GPU:最初是为了加速图形渲染而设计的,用于处理图像和视频数据,以提供高…...
EDID结构
EDID DDC通讯中传输显示设备数据 VGA , DVI 的EDID由128字节组成,hdmi的EDID增加扩展块128字节。扩展快的内容主要是和音频属性相关的,DVI和vga没有音频,hdmi自带音频,扩展快数据规范按照cea-861x标准。 Edid为了让pc或其他的图像…...
4.黑马学习笔记-SpringMVC(P43-P47)
1.SpringMVC简介 SpringMVC技术(更少的代码,简便)与servlet技术功能相同,属于web层开发技术。 SpringMVC是一种基于java实现MVC模型的轻量级web框架。 轻量级指的是(内存占用比较低,运行效率高)…...
CSS 文件格式
A QFrame#andrFrm[status"android_en"] A:表示父类或顶层窗口的类型。如果 A 是一个自定义的类名,确保该类已经正确注册到 Qt 系统中。QFrame:表示具体的控件类型。#andrFrm:表示控件的对象名称(通过 setOb…...
java输出HelloWorld
创建一个java格式文件,这里命令为HelloWorld 这里我选择用notepad编译,也可以直接用记事本 #public 访问修饰词,表示这个类可以被其他任何类访问 #class 定义类的关键字 #HelloWorld 类名,遵循驼峰命名法(首字母大写…...
【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定
症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…...