字节新鲜面经

jvm内存分区

线程私有的运行时数据区: 程序计数器、Java 虚拟机栈、本地方法栈。

线程共享的运行时数据区:Java 堆、方法区。

线程池构造参数

corePoolSize:常驻核心线程数。超过该值后如果线程空闲会被销毁。

maximumPoolSize:线程池能够容纳同时执行的线程最大数。

keepAliveTime:线程空闲时间,线程空闲时间达到该值后会被销毁,直到只剩下 corePoolSize 个线程为止,避免浪费内存资源。

workQueue:工作队列。

threadFactory:线程工厂,用来生产一组相同任务的线程。

handler:拒绝策略。有以下几种拒绝策略:

AbortPolicy:丢弃任务并抛出异常 CallerRunsPolicy:重新尝试提交该任务 DiscardOldestPolicy 抛弃队列里等待最久的任务并把当前任务加入队列 DiscardPolicy 表示直接抛弃当前任务但不抛出异常。

简述公平锁和非公平锁

公平锁:线程排队按顺序去获得锁,排在第一的获得锁, 其他线程进入挂起阻塞状态

优点:不会出现饿死现象

缺点:吞吐量低

非公平锁:线程通过 CAS 尝试先获取锁,获取失败才会挂起进入等待队列,获取成功直接拥有锁。相较于公平锁,减少了线程挂起的概率,提升吞吐量

优点:吞吐量高

缺点:容易出现饿死现象

读写锁

读写锁是针对读线程和写线程的一种实现,我们希望同一时刻多个读线程可以访问,但写线程访问不了。

在同一时刻如果有写线程在工作,其他读线程和写线程就不能访问了。一般会采用维护读锁和写锁,作为具体实现。

什么是可重入锁

可重入锁,即该锁A被线程1获得,

此时线程1可以再次请求获取锁A。

在释放的时候,如果线程1释放了锁A一次,它仍然获得锁A的状态。因此,在释放锁的时候,需要释放锁的次数等于获取锁的次数

简述java的自旋锁

线程获取锁失败后,可以采用这样的策略,可以不放弃 CPU ,不停的重试内重试,这种操作也称为自旋锁。

简述进程间通信方法

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

不同进程间的通信本质:进程之间可以看到一份公共资源;而提供这份资源的形式或者提供者不同,造成了通信方式不同。

进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。

简述线程和进程的区别和联系

一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。

进程在执行过程中拥有独立的地址空间,而多个线程共享进程的地址空间。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)

进程是资源分配的最小单位,线程是CPU调度的最小单位。

通信:由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信(需要一些同步方法,以保证数据的一致性)。

进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。

进程间不会相互影响;一个进程内某个线程挂掉将导致整个进程挂掉。

进程适应于多核、多机分布;线程适用于多核。

简述联合索引和最左匹配原则

联合索引是指对表上的多个列的关键词进行索引。

对于联合索引的查询,如果精确匹配联合索引的左边连续一列或者多列,则mysql会一直向右匹配直到遇到范围查询(>,<,between,like)就停止匹配。Mysql会对第一个索引字段数据进行排序,在第一个字段基础上,再对第二个字段排序。

幻读是什么,如何解决

一个事务连续读两次数据,读取数据量不一样。(两次读之前,数据被其他事务删除或新增)。

将事务隔离级别设置为:串行化,或在innodb引擎中有gap锁的情况下设置可重复读进行解决。



如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!答案获取方式:已赞 已评 已关~

学习更多知识与技巧,关注与私信博主(03)

猜你喜欢

转载自blog.csdn.net/weixin_70730532/article/details/126544584