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

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.mfbz.cn/a/778037.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt QGridLayout 简单实验1

1.概要 2.实验 2.1 实验1 简单实验跨行 2.1.1 代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~W…

Golang语法规范和风格指南(一)——简单指南

1. 前引 一个语言的规范的学习是重要的&#xff0c;直接关系到你的代码是否易于维护和理解&#xff0c;同时学习好对应的语言规范可以在前期学习阶段有效规避该语言语法和未知编程风格的冲突。 这里是 Google 提供的规范&#xff0c;有助于大家在开始学习阶段对 Golang 进行一…

如何魔改vnstat-docker项目使其支持每1分钟采样?

文章目录 一、概述二、官网参考1. 官网地址2. 查看打包过程3.打包命令 三、修改过的文件四、部署运行1. 编排文件2. 运行效果 一、概述 接前文 网络流量监控神器vnStat初探 我们已经了解了vnStat的作用、使用和docker部署。 同时也了解到官方版本支持的采样统计间隔最小为5分…

【Unity】unity学习扫盲知识点

1、建议检查下SystemInfo的引用。这个是什么 Unity的SystemInfo类提供了一种获取关于当前硬件和操作系统的信息的方法。这包括设备类型&#xff0c;操作系统&#xff0c;处理器&#xff0c;内存&#xff0c;显卡&#xff0c;支持的Unity特性等。使用SystemInfo类非常简单。它的…

Linux操作系统的引导过程

系统初始化进程与文件、systemd概述、单元类型、切换运行级别、查看系统默认默认运行、永久切换、常见的系统服务&#xff08;centos&#xff09;-CSDN博客 centos 7系统升级内核&#xff08;ELRepo仓库&#xff09;、小版本升级、自编译内核-CSDN博客 ss命令详细使用讲解文…

tongweb+ths6011测试websocket(by lqw)

本次使用的tongweb版本7049m4&#xff0c;测试包ws_example.war&#xff08;在tongweb安装目录的samples/websocket下&#xff09;&#xff0c;ths版本6011 首先在tongweb控制台部署一下ws_example.war,部署后测试是否能访问&#xff1a; 然後ths上的httpserver.conf的參考配…

游戏服务器搭建选VPS还是专用服务器?

游戏服务器搭建选VPS&#xff0c;VPS能够提供控制、性能和稳定性。它不仅仅是让游戏保持活力。它有助于减少延迟问题&#xff0c;增强您的游戏体验。 想象一下&#xff1a;你正沉浸在一场游戏中。 胜利在望。突然&#xff0c;屏幕卡住——服务器延迟。 很崩溃&#xff0c;对…

PageCache页缓存

一.PageCache基本结构 1.PageCache任务 PageCache负责使用系统调用向系统申请页的内存,给CentralCache分配大块儿的内存,以及合并前后页空闲的内存,整体也是一个单例,需要加锁. PageCache桶的下标按照页号进行映射,每个桶里span的页数即为下标大小. 2.基本结构 当每个线程的…

文件、文本阅读与重定向、路径与理解指令——linux指令学习(一)

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

Python 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

这里函数采用两个参数n和k&#xff0c;并返回二项式系数 C(n, k) 的值。 例子&#xff1a; 输入&#xff1a; n 4 和 k 2 输出&#xff1a; 6 解释&#xff1a; 4 C 2 等于 4!/(2!*2!) 6 输入&#xff1a; n 5 和 k 2 输出&#xff1a; 10 解释&#xff1a; 5 C …

moonlight+sunshine+ParsecVDisplay ipad8-windows 局域网串流

1.sunshine PC 安装 2.设置任意账户密码登录 3.setting 里 network启用UPNP IPV4IPV6 save apply 4.ParsecVDisplay虚拟显示器安装 5.ipad appstore download moonlight 6.以ipad 8 为例 2160*1620屏幕分辨率 7.ParsecVDisplay里面 custom设置2160*1620 240hz&#xff0c;…

python conda查看源,修改源

查看源 conda config --show-sources 修改源 可以直接vim .condarc修改源&#xff0c;

CSS中 实现四角边框效果

效果图 关键代码 border-radius:10rpx ;background: linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) left bottom,linear-gradient(…

CentOS7安装Mysql8.4.0

简介 本文介绍了Linux CentOS系统下Mysql8.4.0的下载和安装方法 环境 (rpm -q centos-release) centos-release-7-2.1511.el7.centos.2.10.x86_64 正文 一、去官网下载Mysql8.4.0 下载参考我另一篇mysql5.7.4的安装 CentOS7.9安装Mysql5.7-m14_centos下mysql5.7下载-CSDN博客…

flutter开发实战-Webview及dispose关闭背景音

flutter开发实战-Webview及dispose关闭背景音 当在使用webview的时候&#xff0c;dispose需要关闭网页的背景音或者音效。 一、webview的使用 在工程的pubspec.yaml中引入插件 webview_flutter: ^4.4.2webview_cookie_manager: ^2.0.6Webview的使用代码如下 初始化WebView…

AJAX-个人版-思路步骤整理版

前置知识&#xff1a;老式的web创建工程方法就是创建项目然后添加web工件&#xff0c;然后添加lib依赖如&#xff1a;tomcat,servlet&#xff0c;等。 传统请求 对于传统请求操作&#xff1a;整体流程也就是创建静态页面&#xff0c; <!DOCTYPE html> <html lang&q…

每日一题~ leetcode 402 (贪心+单调栈)

click me! 这个贪心的推导在leetcode上已经很明确了。 click me! 删除k个数&#xff0c;可以先考虑删除一个数。这也是一种常见的思路。&#xff08;如果进行同样的操作多次&#xff0c;可以先只 考虑一次操作如何实现&#xff0c;或者他的影响。完成这一次操作后&#xff0c;…

MySQL基础篇(二)

如何创建一个数据库&#xff1a; create database 数据库名; 使用数据库&#xff1a; use 数据库名&#xff1b; 如何查看都有哪些数据库&#xff1a; use databases;//后面需要加s 容易忘 如何查看都有哪些表&#xff1a; use tables;//后面需要加s 如何清屏&#xff…

texStudio使用(小白)

原先使用overleaf在线编译&#xff0c;可能eps格式的图片太大导致需要充钱&#xff0c;所以考虑本地安装 安装教程参考B站视频&#xff1a;B站Latex本地编译器安装&#xff1a;TexLive TextStudio 踩到坑&#xff1a; 1. 编译器位置要选择对 因为BibTex选成了Biber导致出现无…

【反悔堆 优先队列 临项交换 决策包容性】630. 课程表 III

本文涉及知识点 贪心 反悔堆 优先队列 临项交换 Leetcode630. 课程表 III 这里有 n 门不同的在线课程&#xff0c;按从 1 到 n 编号。给你一个数组 courses &#xff0c;其中 courses[i] [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课&#xff0c;并且必…