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.mzph.cn/news/866417.shtml

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

相关文章

二分法查找有序表的通用算法(可查链表,数组,字符串...等等)

find_binary函数 注意事项: (1)你设计的迭代器模板中必须有using value_type T,且有加减运算功能,其本上能与C标准库std中一样。 (2)集合必须是有序的。 下面是函数代码: /// &…

一次建表语句触发的ORA-600报错分析

​ 某次在客户Oracle数据库执行一条建表语句时,报出ORA-600错误。 报错代码如下: ORA-00600: 内部错误代码, 参数: [rwoirw: check ret val], [], [], [], [], [], [], [], [], [], [], [] 相关的建表语句如下: ​ 在报错发生后,…

Android studio开发入门教程详解(复习)

引言 本文为个人总结Android基础知识复习笔记。如有不妥之处,敬请指正。后续将持续更新更多知识点。 文章目录 引言UITextView文本基本用法实际应用常用属性和方法 Button按钮处理点击事件 EditText输入框基本属性高级特性 ImageView图片ImageView的缩放模式 Prog…

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中,udp发送和接收,其实非常简单,但是实际工作中,其实涉及到帧头帧尾,字节对齐,以及大小端序的问题。比如网络中,正规的一般都是大端序,而不是小端序,大多数的…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…

单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型: Jave:LNMT PHP:LNMP Python: LNMU 项目部署: 1.项目的类型(项目的开发语言) 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…

day11_homework_need2submit

Homework 编写—个将ts或mp4中视频文件解码到yuv的程序 yuv数据可以使用如下命令播放: ffplay -i output yuv-pix_fmt yuv420p-s 1024x436 要求: ffmpeg解析到avpacket并打印出pts和dts字段完成解码到avframe并打印任意字段完成yuv数据保存 // teminal orders on bash cd ex…

11.SQL注入-盲注基于(base on boolian)

SQL注入-盲注基于boolian案例利用 首先总结一下sql语句中的函数意思 #查看当前所在的数据库 mysql> select database(); ------------ | database() | ------------ | pikachu | ------------ 1 row in set (0.00 sec)#函数substr里1是从第几位开始取字符,2…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展,用于运行用户脚本,这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务,比如自动填写表单、移除广告、改变页面布局等。适用浏览器: Tampermonkey 适用于多数主流浏览…

Java的进程和线程

一Java的进程 二Java的线程 多线程 ◆如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”。 ◆多个线程交替占用CPU资源,而非真正的并行执行。 ◆多线程好处。 ◆充分利用CPU的资源。 ◆简化编程模型。 ◆良好的用…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里

【抽代复习笔记】26-群(二十):子群的定义以及第一、第二判定定理

子群 定义1:(G,o)是一个群,H是G的非空子集,若H关于G的乘法o也能作成群(满足群的判定定理:封闭性、结合律、单位元、逆元),则称H为G的子群,记作H ≤ G;若H是G的真子集&am…

【启明智显分享】手持遥控器HMI解决方案:2.8寸触摸串口屏助力实现智能化

现代生活不少家居不断智能化,但是遥控器却并没有随之升级。在遥控交互上,传统遥控器明显功能不足:特别是大屏智能电视,其功能主要由各种APP程序实现。在电脑上鼠标轻轻点击、在手机上触摸屏丝滑滑动,但是在电视上这些A…

SpringBoot 启动流程二

SpringBoot启动流程二 我们首先查看构造方法 SpringApplication 我们发现这个构造方法还是在SpringApplication类里面 这个构造方法还是调用了自身的构造方法 传入了两个参数 第一个参数叫resourceLoader 传入的是一个资源加载器 要从外部读入东西 这个方法通过this关键字…

c++纵横字谜

1.实现一个纵横字谜 2.支持14x14的网格 3.可以查看答案 4.猜测错误会提示答案信息 5.从txt读取词汇 6.每次游戏开始 随机生成纵横字谜 n’h

leetcode216.组合总和III、40.组合总和II、39.组合总和

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出…

deepin UOS AI 如何配置自定义模型

科技飞速发展的今天,操作系统作为计算机系统的灵魂,其每一次的更新与变革都牵动着无数用户的心弦。近日,开源操作系统 deepin 迎来了一次重大更新,这次更新不仅在性能上进行了全面优化,更在 AI 智能化方面迈出了划时代…

【解决方案】笔记本电脑屏幕亮度调节失效(Dell G15 5510 使用Fn调节)

目前解决方案:使用驱动总裁(其他的驱动安装软件应该也可以,个人觉得这个好用),更新显卡驱动即可。如图所示本人更新了Intel UHD Graphics核显驱动,功能回复正常。 使用Fn快捷键调节亮度如图所示&#xff0…

ARIES,数据恢复算法,万变不离其宗...

今天来聊两个问题: 1. 如果缓冲池(buffer pool)满了,哪些数据页(page)要刷盘,哪些数据页不刷盘? 2. 数据库崩了,怎么利用检查点(checkpoint)与预写…

Django 定义模型执行迁移

1,创建应用 Test/app8 python manage.py startapp app8 2,注册应用 Test/Test/settings.py 3,配置路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(app8/, include(a…