Java多线程+并发 快问快答

server/2024/11/15 6:02:09/

这是Java多线程和Java并发这两个八股文的快问快答。其实我就会这点,感觉多线程和并发这里并不需要了解的很深入,我也就没有建立起系统观。把这些零零散散的知识点理解好应该就行了。感觉中小厂不会问这么难,中小厂就问一些简单的。

关于线程安全 + 锁的一些概念性问题

1、你是怎么理解线程不安全的?

多个线程同时对一个共享变量进行操作,导致数据出现错误。比如现在有一个共享变量 i=0,然后有10个线程同时对 i 进行++操作,这10个线程同时读。同时修改,同时写回,最后导致i只增加了1次而不是10次。这就是线程不安全。

2、多线程环境下,我们可以怎么解决线程不安全的问题?

可以用 synchronized 关键字修饰方法或代码块,从而锁住方法或代码块,保证线程安全。或者用volatile 关键字修饰共享变量,使得共享变量的修改具有可见性,共享变量相关的指令不能被重排序,保证线程安全。

3、刚才说到了锁,那你觉得锁怎是么实现线程安全?

不会。

4、刚才我们说到了锁,乐观锁和悲观锁了解吗?可以说一说他们的区别吗?

乐观锁是对共享变量进行修改的时候不加锁,等到修改完成准备写回时,如果发现共享变量被改了就回滚。比如 CAS 操作。

悲观锁是在对共享变量进行修改之前就加锁,防止其他线程对这个共享变量进行修改。比如synchronized 关键字。

5、Java 中有些是基于乐观锁实现的,有些是基于悲观锁实现的,你了解到的有哪些呢?

乐观锁比如说 CAS 操作;悲观锁比如说 synchronized 关键字。

关于Java线程的一些杂问题

1、在 Java 中,一个线程的生命周期有哪些?

新建态、就绪态、运行态、阻塞态、终止态

2、在 Java 的中,创建线程的方式有哪些?

通过继承 Thread 类或者实现 Runnable 接口,重写里面的 run() 方法来创建线程

3、你觉得 Thread 类和 Runable 接口的最大区别是什么?

Thread 是一个类,Runnable 是一个接口,Thread 类实现了 Runnable 接口

4、说一说 run() 方法和 start() 的区别?

不会。

5、说一说 wait() 和 sleep() 的区别?

sleep() 只会让出 CPU,不会释放锁;wait() 又让出 CPU,又释放锁。

6、说一说 notify() 和 notifyAll() 的区别以及使用场景?

notify() 是随机唤醒一个等待该资源的线程,而notifyAll()是唤醒所有等待该资源的线程。

volitale连环炮

1、volitale 了解吗?简单介绍一下

volatile是一个关键字,用来修饰共享变量。当一个共享变量加上了volatile关键字后,假如一个线程修改了这个变量的值,那么其他变量都可见。此外,关于这个共享变量的指令不会被重排序,从而防止了变量更新 不符合预期的问题。

synchronized连环炮

1、简单说一下 synchronized 的作用?

synchronized是一个关键字,一般加在方法或者代码块上。但是无论它加在方法还是代码块上,本质上都是用来修饰对象。通过加上synchronized关键字,就可以对对象进行加锁从而实现线程同步。

CAS连环炮

1、简单介绍一下 CAS,什么是 CAS ?

由于synchronized关键字底层是基于悲观锁的,所以开销太大。我们想要一个不加锁的操作,比如CAS。CAS是一个原子操作,它不用加锁。

举个例子:比如内存中有一个value=10。

(1)将value=10拿出来赋值给A

(2)对A进行操作,比如A+1=B

(3)判断A与value是否相等,若相等证明value没有被修改,那就将B写入value。若不相等证明已经被改了,就回滚。

2、CAS 是如何解决 ABA 问题的?

在每次修改值的时候加上版本号。

线程池连环炮

1、为什么要使用线程池?

如果没有线程池的话,一个线程需要串行执行很多个任务,这样子太慢了。所以引入线程池,让多个线程同时执行任务。

2、线程池是怎么提升效率的?简单说一下线程池都有哪些可选参数?

看图说话:

3、线程数是越大越好吗?讲一下核心线程数与最大线程数之间的关系?

线程数并不是越多越好,高峰时期任务可能会比较多,这时候线程数可以多一点,但是不是高峰期的时候任务会比较少,不需要这么多线程。

最大线程数=核心线程数+非核心线程数。

4、运行的时候,核心线程数能不能修改?

可以。

5、一个任务进来后,线程池是怎么处理的?


http://www.ppmy.cn/server/4839.html

相关文章

使用 usePrevious 实现 React 函数组件中上一状态值的追踪

在 React 开发过程中,有时我们需要在函数组件的某个阶段或事件处理函数中访问到上一次的状态值。然而,React 并未提供直接获取上一状态的内置机制。为了解决这个问题,我们可以采用一种名为 usePrevious 的自定义 Hook。本文将详细介绍 usePre…

结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用 示例项目(github)&…

项目实现:Boost搜索引擎

目录 一.项目背景 二. 搜索引擎的宏观原理 三.使用到的技术栈与项目环境 四.正排索引vs倒排索引 五.认识标签与去标签 六.建立索引模块 七,编写http服务端 八,编写前端页面 九.搜索结果的优化 遇到的问题: 项目源码:boos…

艾体宝方案 | ITT-Profitap IOTA——铁路运输的远程网络捕获和故障排除方案

在移动互联时代,铁路运输的数字化转型已成不可逆转的趋势。然而,随之而来的是对网络连接质量和故障排查的更高要求。本文将探讨如何利用艾体宝Profitap IOTA技术,在火车上实现远程网络捕获和故障排查,助力铁路运输行业迈向智能化未…

手撸词法分析器(C/C++)

手撸词法分析器(C/C) 一.背景二.什么是词法分析器?三.代码四.思考 一.背景 这学期开设了编译原理,要求写个基本的词法分析器。所以博主就自己写了一份代码,也比较简单基础。 二.什么是词法分析器? 简单来…

【C语言__结构体__复习篇5】

目录 前言 一、结构体基础知识 1.1 结构体的语法形式 1.2 创建结构体变量 1.3 结构体变量的初始化 1.4 点(.)操作符和箭头(->)操作符 二、匿名结构体 三、结构体自引用 四、结构体内存对齐 4.1 内存对齐的规则 4.2 出现结构体内存对齐的原因 4.3 修改默认对齐数 五、结…

Vue3: toRefs与toRef的基本使用

一、前言 本文主要介绍toRefs与toRef的基本使用。 二、内容 1、基本概念 作用: toRefs与toRef可以将一个响应式对象中的每一 个属性,转换为ref对象;不同 toRefs与toRef功能一致,但toRefs可以批量转换。 2、toRefs 如果把reactive定义的…

文心一言api开发者文档,python版ERNIE-3.5-8K-Preview模型调用方法

ERNIE 3.5是百度自研的旗舰级大规模⼤语⾔模型,覆盖海量中英文语料,具有强大的通用能力,可满足绝大部分对话问答、创作生成、插件应用场景要求;支持自动对接百度搜索插件,保障问答信息时效。本文介绍了ERNIE-3.5-8K-Pr…