2024年Java常见面试题目,面试官的灵魂拷问

二、解析

1. 硬件层的并发优化基础知识

存储器的层次结构图如下:

各级缓存耗时对比:

采用分层缓存的层次结构会带来数据不一致问题,如下图:

那么如何保证数据的一致性,现代CPU处理办法有两种:

(1) 锁系统总线;

(2) 利用缓存一致性协议MESI(Intel处理器用的比较多,还有很多其他的缓存一致性协议),大致结构如下图:

2. CPU的乱序执行

CPU中有个乱序执行的概念,概念图如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CPU在执行指令的时候,往往不是顺序执行,但是会遵守as-if-serial原则,也就是最终一致性原则。CPU为了提高指令执行效率,会在一条指令执行过程中(比如去内存读数据),去同时执行另一条指令,前提是这两条指令没有依赖关系。虽然指令执行顺序发生改变,但是不会影响单线程执行结果。多线程情况下为了不让CUP进行指令重排序,则需要用到Volatile关键字,因为Volatile的重要作用之一就是防止指令重排序。

CPU还会存在合并写的现象。当第一条指令往上级缓存写入数据时,由于上级缓存访问速度比较慢,可能第二条指令又对上一条指令的结果进行了修改,那么CPU将这两条指令合并的最终结果一次性的写入到缓存中,这就成为合并写。

3. 如何保证不乱序执行

(1) 内存屏障:java采用的是内存屏障,内存屏障其实就是一个CPU指令,在硬件层面上来说可以扥为两种:Load Barrier 和 Store Barrier即读屏障和写屏障。主要有两个作用:

a. 阻止屏障两侧的指令重排序;

b. 强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

职业经验的分享。

[外链图片转存中…(img-DeUeSTQv-1710659696209)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,如果你想要检查一个数组是否包含某个特定的值,你可以使用Arrays类的asList()方法将数组转换为列表,然后使用列表的contains()方法来判断是否包含该值。例如,假设你有一个字符串数组vowels和一个字符串数组subset,你可以使用以下代码来检查subset是否是vowels的子集: String\[\] vowels = { "A", "I", "E", "O", "U" }; String\[\] subset = { "E", "U" }; boolean foundAll = Arrays.asList(vowels).containsAll(Arrays.asList(subset)); System.out.println("vowels contains all the elements in subset = " + foundAll); 这段代码将vowels和subset数组转换为列表,并使用containsAll()方法来判断subset是否是vowels的子集。如果返回值为true,则表示vowels包含subset中的所有元素。\[1\] 在底层,contains()方法会调用indexOf()方法来查找元素的索引。indexOf()方法会遍历数组并逐个比较元素,如果找到匹配的元素,则返回其索引值,否则返回-1。\[2\] 需要注意的是,如果数组的长度很大,例如10000,你可以使用随机数生成器来填充数组,然后再进行检查。例如,你可以使用以下代码来生成一个长度为10000的字符串数组arr,并将其填充为随机数: String\[\] arr = new String\[10000\]; Random s = new Random(); for(int i=0; i<10000; i++){ arr\[i\] = String.valueOf(s.nextInt()); } 然后,你可以使用上述方法来检查数组arr是否包含某个特定的值。\[3\] #### 引用[.reference_title] - *1* [java数组包含某个值_如何检查Java数组是否包含值?](https://blog.csdn.net/cunchi4221/article/details/107472095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [灵魂拷问:如何检查Java数组中是否包含某个值 ?](https://blog.csdn.net/qing_gee/article/details/103575706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值