Java技术题目

这是一篇关于Java并发编程的题目集,涵盖了volatile、线程池、TCP通信、Redis、锁机制、内存管理等多个方面的问题。文章讨论了volatile如何工作、线程池中哪种锁的性能最佳、如何从大文件中快速读取内容、如何解决TCP的丢包问题,以及公平锁、非公平锁、自旋锁的区别等。同时,提到了在不同并发场景下,从Redis到堆内再到堆外内存的转换原因。文章还探讨了程序员应具备的重要能力和常见的共识算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日一题

1.volatile修饰的user对象,里面有两个属性,int a=1和int b=2.(注意:a,b没有被volatile修饰) 这个user对象是另外一个对象Tasker的成员变量。然后tasker对象已经在程序中运行起来了(一个线程运行,我们叫A线程吧)。紧接着又有另外一个线程(B线程)修改了user对象里的a属性,把1修改成了3;那么请问,A线程能否第一时间感知到a属性发生变化呢,也就是知道他变成了3。

答:线程副本里面保存的是对象,所以是知道的(忘记老师答得还是同学答的了,大家知道的,麻烦在群里解答一下。)

2.一个线程池里面有N个线程,并发下执行某一段逻辑(这段逻辑执行的时间很短,大概1-5ms最多),加锁的方式运行,使用哪一种锁性能最高,
a.公平锁;
b.非公平锁;
c.自旋锁;
d.synchronized锁
答:a 公平锁

3.现在我有一个1g的大文件,如何快速的从中间读取10个字节内容,比如我就是想从1g的文件中读取中间
我就是512m往后的10个字节,用什么方式来做
答:RandomAccessFile

4.现在我有9个int类型组成一个数组,2,2,6,6,5,8,8,1,1
如何用最快的方式找出唯一的一个5
答:亦或算法

5.TCP通信里,如何做到,同一个端口运行多个应用程序,而不报错already in used
答:可以开启TCP的端口重绑定功能TCP reused

6.TCP出现丢包问题时,我们知道他总是从最小的位置开始重传的,比如传输10个字节,中间丢了一个字节,假设1,2,3,5,6,7,8,9,10。。4接收端没有收到,那么发送方会记录最小的4,开始重新传输数据,45678910,这样就造成了浪费,因为我们仅仅只有4没有收到,如何设计自己的协议,优化这一问题
答:这个没有答……

7.举个抢红包的场景,如果用redis来实现抢红包,比如10个红包,大家并发来抢,使用什么数据结构最合适
答:没有答……

8.工作中线程池提交有两种方式,execute和submit;他们的区别是什么,在使用的时候,需要注意什么问题(比如抛异常了)
答:无答……

9.使用线程池的时候,比如我已经设置了core size=10,并且程序运行起来了,那么有什么办法能够在不停止服务的情况下改变这个core size,比如改成20,前提是我可以拿到当前线程池对象的引用。
答:印象中是,直接调用set。(当时还有原理的讨论,忘记记录了,大家知道答案的,麻烦在群里解答一下)

10.大家一定非常熟悉jdk的动态代理,也就是实现invocationhandler接口,什么是静态代理,思考一下在什么场景下使用
答:……

11.原生socket网络通信的tcp拆包黏包问题,应该如何去解决,比如现在 客户端每次都会发送8个字节给服务器端,那么在原生socket出现拆包 黏包的时候,应该使用什么方式去解决这个问题.比如客户端 发送2个数据包 正常是这样的8+8,然后服务端直接安装8去做切分去读就能知道,但是呢,还有可能是这样的:7+9这个时候就出现拆包黏包了,或者11+5 这种 我们的服务器端很郁闷,怎么才能读出来2个8个字节的数据包呢

12.公平锁、非公平锁, 自旋锁 的区别,分别有啥优缺点
大目老师答:锁就是大家在抢着去上厕所一个人在蹲坑,一帮人在等他拉完出来
公平锁:在外面等着上厕所的人排队,先排队的先进去
非公平锁:就是可能会插队
synchronized就是非公平的,reentrantlock可以指定公平或者非公平

  1. 大家最开始抗并发,首先会想到redis ,然后过了很久 就会发现redis不合适,就会用堆内内存,然后过了很久又发现不合适,就会选择堆外内存存储啦,问3者之间为什么会转换?
    阿神老师答:第一阶段:并发在几千上万的时候,你的热数据都会想到使用缓存来存储也就是我们常说的redis,
    但是过了一段时间,业务高峰期上涨发现redis经常被打满扩容已经解决不了问题了,尤其是流量入口qps很高的,用redis做缓存不太合适。这个时候程序就应该经过优化存储到堆内了,我们不做redis请求直接请求内存性能高。redis只做一个兜底策略,或者快速降级,很开心又玩了一段时间……
    又过了一段时间,可能由于热数据和非热数据经常转换,发现应用服务频繁GC导致系统性能严重下降,这时候可能会选择LRU去做淘汰策略,但是有时候又发现不太合适具体根据业务,所以就变成了堆外存储
    本荒提问对堆存储是什么:
    内存:操作系统16G内存你分了8G给你的应用,剩下8G是OS的也可以称为堆外。

14.volatile 修饰map,或者list(容器类)有什么作用?
答:……(本荒不知道)

15.我们知道内存最简单可分为堆内堆外两块,一般jvm是控制堆内内存,Linux又分用户态内核态和操作系统调度,那么有个关于访问内存的问题,那为什么操作系统不直接访问Java堆内的内存区域?
严格说Intel cpu提供Ring0-Ring3 四种级别的运行模式,Ring0级别最高,Ring3最低;Linux使用了Ring3级别运行用户态,Ring0作为内核态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;因此用户态是没有权限去操作内核态的资源的,它只能通过系统调用外完成用户态到内核态的切换,然后在完成相关操作后再有内核态切换回用户态
因为如果操作系统(JNI java native interface)直接访问 堆内内存,java 在这个时候自己做了GC 就会导致出现问题 比如内存数据乱套了这种。。

16.我们知道在一些高性能的中间件场景下都会采用堆外内存池化的方式,那么池化如何实现呢?
神引(就是神之指引):这个问题大家可以参考netty的池化底层实现。
netty 就是把directbuffer 分成了3大部分 tiny small 和 normal 然后底层是一个满二叉树记录一些树的深度啊之类的,找资料的时候看看这些类似相关的
然后进行阅读理解,为什么netty要这么做,我们自己封装堆外内存做缓存并没有这么做,当然也没有必要这么做,因为 netty 是大流量的实时的,不可能频繁的去 create directbuffer 这样太消耗系统资源 所以有了池化的设计,用于做复用,而缓存一般都是关心命中、过期等问题,所以没必要太追求池化

  1. 和我最近的工作有关,小伙伴们觉得作为一个程序员,在工作的过程中其中最重要的几种能力是什么?你认为最佩服的一种能力是什么
    我觉得,最重要的能力,还是线上排查问题,定位问题的能力。

18.对于业界比较常用的共识算法有哪些? 说说他们的区别,以及实现理念,如:paxos、zab、raft;也可以重点聊聊下一代共识算法raft的实现 etcd、sofa jraft 、DLedger 等优秀的 基于raft的实现

19.什么是jvm的 stop the world 影响jvm stw的因素有哪些,遇到过哪些线上出现stw的问题,怎么排查和解决的?

stop the world,垃圾回收时停止所有用户线程.jvm遍历对象索引的时候会停止整个程序的运行,只不过这个速度快到 我们感觉不到,遍历对象索引的时候会 有内存交换,回收的速度和创建对象的速度成正比,但是这个GC过程不是一定发生的,也就是说 在还有内存空间的情况下 ,GC不一定理你.

20.能否解释一下reactor模型,master-worker模型,他们有什么共同点和区别, 能否手写一个 reactor 和 master-worker
zookeeper 原生的api 实现watcher 就是 一个经典的 reactor 模型 包括原生nio的多路复用写法 也是简单的reactor 只不过没有worker pool而已,而 master worker 类似调度思想 比如 leader 和 supervisor 之间的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值