Java - 程序员面试笔记记录 实现 - Part3

news2024/10/6 6:18:31

4.1 线程与进程

线程是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间以及一些进程级资源,但拥有自己的栈空间。

4.3 Java 多线程

方法一:继承 Thread 类,重写 run 方法;

方法二:实现 Runnable 接口,并实现 run 方法;

方法三:实现 Callable 接口,重写 call 方法;

方法四:使用线程池;

4.4 run 和 start 区别

start 方法启动线程后,线程为就绪状态,JVM通过调用线程的 run 方法完成实际的操作。run 方法结束后线程终止。

直接调用 run 方法只会作为普通的函数调用,程序中仍然只有主线程一个线程。

4.5 多线程同步

方法一:Synchronized 关键字,保证同一时间仅有一个线程访问;

方法二:JDK5 新增了 Lock 接口

4.6 Lock

ReentrantLock:重入锁,是指在同一线程中,外部方法获得锁后,内部方法仍然可以回去该锁,若锁不具有可重入性会导致死锁。其持有的是对象监视器。借助 Condition 可以实现等待 / 通知模型。

ReentrantReadWriteLock:将锁分为读锁和写锁,读锁可以在没有写锁的时候被多个线程持有,只有写锁是独占的。如果写锁被一个线程占用,其他线程无论是想要获取读锁还是写锁,都必须等待写锁被释放。

4.7 synchronized 与 lock 的异同

1. synchronized 是托管给 jvm 执行的,lock 的锁定是代码控制的。

2. 资源竞争不激烈的情况下 synchronized 性能更优;资源竞争激烈时 synchronized 性能降低较多。

3. Lock 需要手动控制锁的释放。

4. synchronized 修饰方法时,静态 static 方法持有的是类锁,非静态方法持有的是对象锁。

4.8 sleep 和 wait 的区别

1. sleep 是用来控制自身流程的,wait 用于线程间的通讯。

2. sleep 不释放锁;wait 释放锁;

4.8 补充 - yield

Thread.yield() 方法可以让当前线程放弃当前的CPU时间片,但这并不意味着当前线程会立即停止执行。实际上,yield 方法只是提示线程调度器(Thread Scheduler),当前线程愿意让出对CPU的使用,但是否真的会立即让出CPU时间片,取决于线程调度器的实现和当前的线程调度策略。

4.9 终止线程

stop():释放线程已经锁定的资源,可能会导致程序执行的不确定性。

suspend():由于不会释放锁容易发生死锁。

一般建议让线程自行结束。或者设置一个标记位结束(线程处于非运行状态可以触发异常来安全结束线程)

4.10 死锁

必要条件

1. 互斥:资源具有排他性。

2. 请求和保持:线程至少已经持有一个资源并申请新的资源。

3.不剥夺:已获得的资源未释放时不可被剥夺。

4.环路等待。

4.11 守护线程 Daemon

JVM 中只有守护线程在运行时,JVM会自动关闭。

4.12 Join

线程合并:调用该方法的线程执行完 run() 后再执行 join 后的代码。

4.13 线程抛出的异常

线程抛出的异常无法使用 try/catch 捕捉。JDK 5 提供了Thread.UncaughtExceptionHandler 来处理线程中未被捕获的异常。

4.14 线程池

ThreadPoolExecutor 是 ExecutorService 的一个实现。可以最大化利用线程空闲时间和空间。

处理任务的流程:

1. 线程池的线程数量小于 corePoolSize ,创建新线程执行任务。

2. 线程池的数量大于 corePoolSize,暂时把任务存到工作队列等待。

3. 工作队列也满了,线程数小于最大限制,创建新线程执行,若已经超过最大限制,执行拒绝策略。

newFixedThreadPool: 线程池大小固定。

newCachedThreadPool:线程池基本大小为 0,空闲线程会在60s内销毁。每个新任务都会有线程执行。适用于执行速度较快且较小的场景。线程池的大小完全依赖 JVM 能创建的最大线程大小。

newSingleThreadExecutor:单线程的线程池。

newScheduledThreadPool:可以按一定的周期执行任务。

4.15 ThreadLocal

threadLocal.get 获取到的值对每个线程是唯一的。

线程被创建时,线程的对象存储在堆中,栈中存放引用;ThreadLocal 对象被初始化时,存储在堆中的,同时栈中保存引用。当 ThreadLocal 的方法被调用时, JVM会根据引用找到实例,查看 ThreadLocalMap 实例是否被创建并初始化使用。即 ThreadLocal 会把指定值和当前线程绑定在一个 map 里。

4.16 Latch

指定线程等待计数线程完成工作后再执行 latch.await() 之后的代码。CountDownLatch 不可以重用。

4.17 Barier

等待一组线程完成某个条件后再一起执行后续功能的能力。

4.18 Fork / Join

将大任务分割成小的任务后并运行,最后将小任务的最终结果合并为大任务。需保持子任务独立。内部实际为线程池。

4.19 CAS

CAS 保证操作是原子性的,sun.misc.Unsafe 提供一系列相关方法。

ABA问题:更新时增加一个版本号。

4.20 线程调度与优先级

线程的五个状态

1. 新建:创建后的线程进入这个状态。

2. Runnable:start 方法调用后进入可运行状态

3. Running:获得 CPU使用权

4. Blocking:阻塞,放弃CPU;同步阻塞(获取锁失败)会放入锁池。等待阻塞(wait)放入等待队列中。其他(IO、sleep、join)

5. Dead:结束

Java 中优先级可以划分为10个等级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验五 数据库完整性约束的实现与验证

题目 在实验四的基础上,重新创建以下三个表: 会员表:member(memno,memname,address,telephone,username,userpwd),主码为memno,属性memname不能取空值 员工表:employee(empno,empname,depno,sex,telephone…

【电源专题】DC-DC电路设计为什么一般只考虑电感DCR而不考虑Q值呢?

什么是电感器(线圈)的Q值? Q值是表示电感器质量的参数。Q是Quality Factor(质量系数)的简称。线圈会顺利流过直流电流,但会对交流电流产生电阻。这称为感抗,交流频率越高则越大。 此外,绕组虽是导体…

基于Istio的多网关运行时:配置、部署和应用

1. 引言 Istio是一个开源的服务网格,主要应用于简化微服务架构中的服务间通信、提供强大的监控能力以及加强服务的安全管理。通过利用Sidecar模式部署的Envoy代理,Istio能够在几乎无需修改服务代码的情况下,实现服务发现、负载均衡、加密通信…

C语言实战 | Flappy Bird游戏

Flappy Bird游戏是由一名越南游戏制作者独自开发的,曾经风靡全球。游戏规则非常简单,玩家必须控制一只小鸟,跨越由各种长度的水管所组成的障碍物,如果撞上管道游戏就结束,如图11.11所示。 ■ 图11.11Flappy Bird 游戏 …

go语言day08 泛型 自定义错误处理 go:协程

泛型: 抛错误异常 实现error接口类型 用java语言解释的话,实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言,在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…

IMU用于仿生水下机器人姿态估计

近期,自中国农业大学的研究团队从海豚身上汲取灵感,成功研发出一种创新性的双腱驱动机器人海豚尾鳍。这项创新性的设计不仅能够实现全方向运动,还能精细地模拟海豚的推力特性,揭示了其背后隐藏的力学秘密。 这款机器人尾鳍设计独特…

23432443

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

A股现在3000点已经是顶了吗?

今天的A股,让人咬牙切齿了,你们知道是为什么吗?盘面上出现2个重要信号,一起来看看: 1、今天两市高开低走,近4900家股票回落,股民痛心疾首了。昨晚中概股都涨疯了,美股的科技股微软和…

【web APIs】快速上手Day03(Dom事件进阶)

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

2024亚太杯中文赛数学建模选题建议及各题思路来啦!

大家好呀,2024年第十四届APMCM亚太地区大学生数学建模竞赛(中文赛项)开始了,来说一下初步的选题建议吧: 首先定下主基调, 本次亚太杯推荐大家选择B题目。C题目难度较高,只建议用过kaiwu的队伍…

商务视频推广打造有吸引力的7个秘诀-华媒舍

商务视频推广是现代企业发展的重要工具,它能够帮助企业吸引更多的目标客户,提升品牌知名度,增加销售量。但是,如何打造一部有吸引力的商务视频推广呢?本文将为您介绍7个秘诀,帮助您在商务视频推广中取得成功…

中国国家标准介绍

一、介绍 中国国家标准信息公共服务平台,这是由中国国家市场监督管理总局和中国国家标准化管理委员会共同运营的官方网站 https://openstd.samr.gov.cn/ 标准分为三类: GB:强制性国家标准GB/T:推荐行国家标准GB/Z:指导…

【Linux系统】文件系统 软硬链接

文件被打开了? 这个文件已经被打开???什么意思,我们的Linux中存在非常多的文件,被打开的文件是少量的,我们要找到这个文件,先在磁盘中找到,就必须要通过这个文件的文件名…

一站式广告监测新体验,Xinstall助你广告投放更精准

在这个移动互联网飞速发展的时代,App推广与运营成为了每个开发者与广告主关注的焦点。然而,面对琳琅满目的广告平台和复杂的投放环境,如何精准评估广告效果、优化投放策略,成为了摆在面前的一道难题。今天,我们就来聊聊…

Linux中为什么etc是存放配置文件

在计算机系统中,/etc 是一个目录的名称,通常位于Unix和类Unix操作系统中,如Linux。这个目录用于存放系统配置文件。/etc 的命名来源于早期Unix系统中的 "etcetera"(拉丁语 "et cetera" 的缩写,意为…

RK3568驱动指南|第十六篇 SPI-第195章 实践:移植官方mcp2515驱动

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Ollama基于Casaos一键部署,并接入Dify知识库,无需再为API付费

什么是Ollama Ollama是一个开源的大型语言模型服务工具,它帮助用户快速的运行大模型。浪浪云将它做为一键部署通过简单的安装,用户可以执行一条命令就可以运行开源大型语言模型,如 llama3 ,通以千问。极大地简化了部署和管理LLM的过程&#x…

vue通过后台返回的数字显示不同的文字内容,多个内容用、隔开

后台返回的数据 显示效果&#xff1a; html&#xff1a; <el-table-columnalign"center"label"使用过的小程序"width"124"v-if"activeTab 0"><template #default"scope"><divv-for"(item, index) in s…

Redis 典型应用——分布式锁

一、什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况&#xff0c;此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于 "线程安全" 的问题&#xff1b; 而 Java 中的 synchronized&#xff0c;只能在当前进程中生…

如何利用小程序容器技术搭建小程序生态?

小程序&#xff0c;作为现代移动互联网生态中的重要基础设施&#xff0c;正以其独特的创新性和便捷性展现出勃勃生机。截至2021年&#xff0c;全网小程序的数量已经突破了700万&#xff0c;其中微信小程序的开发者达到了300万之多。这一数字不仅代表了小程序在技术层面的成熟度…