【Java】几道让你拿offer的面试题

【面经】国企 Java后端实习生面经 Java后端实习面经 阅读详情

前言

只有光头才能变强

之前在刷博客的时候,发现一些写得比较好的博客都会默默收藏起来。最近在查阅补漏,有的知识点比较重要的,但是在之前的博客中还没有写到,于是趁着闲整理一下。

文本的知识点:

  • Integer常量池
  • TCP拆包粘包
  • select、poll、epoll简单区别
  • jdk1.6以后对Synchronize锁优化
  • Java内存模型

本文力求简单讲清每个知识点,希望大家看完能有所收获

一、神奇的Integer

前阵子在群上看有人在讨论关于Integer的true或者false问题,我本以为我已经懂了这方面的知识点了。但还是做错了,后来去请教了一下朋友。朋友又给我发了另一张图:

后来发现这是出自《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》中的10.3.2小节中~


public class Main_1 {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == (a + b));
        System.out.println(c.equals(a + b));
        System.out.println(g == (a + b));
        System.out.println(g.equals(a + b));
        System.out.println(g.equals(a + h));
    }

}

你们可以先思考一下再往下翻看答案,看看能不能做对。

1.1解题思路

在解这道题之前,相信很多人都已经知道了,在Java中会有一个Integer缓存池,缓存的大小是:-128~127

答案是:

  • true
  • false
  • true
  • true
  • true
  • false
  • true

简单解释一下:

  • 使用==的情况:
    • 如果比较Integer变量,默认比较的是地址值。
    • Java的Integer维护了从-128~127的缓存池
    • 如果比较的某一边有操作表达式(例如a+b),那么比较的是具体数值
  • 使用equals()的情况:
    • 无论是Integer还是Long中的equals()默认比较的是数值。
    • Long的equals()方法,JDK的默认实现:会判断是否是Long类型
  • 注意自动拆箱,自动装箱问题。

反编译一下看看:


import java.io.PrintStream;

public class Main_1 {
    public static void main(String[] paramArrayOfString) {
        Integer localInteger1 = Integer.valueOf(1);
        Integer localInteger2 = Integer.valueOf(2);
        Integer localInteger3 = Integer.valueOf(3);
        Integer localInteger4 = Integer.valueOf(3);
        Integer localInteger5 = Integer.valueOf(321);
        Integer localInteger6 = Integer.valueOf(321);
        Long localLong = Long.valueOf(3L);

        // 缓存池
        System.out.println(localInteger3 == localInteger4);

        // 超出缓存池范围
        System.out.println(localInteger5 == localInteger6);

        // 存在a+b数值表达式,比较的是数值
        System.out.println(localInteger3.intValue() == localInteger1.intValue() + localInteger2.intValue());

        // equals比较的是数值
        System.out.println(localInteger3.equals(Integer.valueOf(localInteger1.intValue() + localInteger2.intValue())));
        // 存在a+b数值表达式,比较的是数值
        System.out.println(localLong.longValue() == localInteger1.intValue() + localInteger2.intValue());
        // Long的equals()先判断传递进来的是不是Long类型,而a+b自动装箱的是Integer类型
        System.out.println(localLong.equals(Integer.valueOf(localInteger1.intValue() + localInteger2.intValue())));

        // ... 最后一句在这里漏掉了,大家应该可以推断出来
    }
}

我使用的反编译工具是jd-gui,如果还没有试过反编译的同学可以下载来玩玩:

二、Synchronize锁优化手段有哪些

多线程文章回顾:

之前在写多线程文章的时候,简单说了一下synchronized锁在jdk1.6以后会有各种的优化:适应自旋锁,锁消除,锁粗化,轻量级锁,偏向锁。

本以为这些优化是非常难以理解的东西,其实不然~~~简单了解一下还是很好理解的。

2.1适应自旋锁

锁竞争是kernal mode下的,会经过user mode(用户态)到kernal mode(内核态) 的切换,是比较花时间的。

自旋锁出现的原因是人们发现大多数时候锁的占用只会持续很短的时间,甚至低于切换到kernal mode所花的时间,所以在进入kernal mode前让线程等待有限的时间,如果在此时间内能够获取到锁就避免了很多无谓的时间,若不能则再进入kernal mode竞争锁。

在JDK 1.6中引入了自适应的自旋锁,说明自旋的时间不固定,要不要自旋变得越来越聪明。

自旋锁在JDK1.4.2中就已经引入,只不过默认是关闭的,可以使用-XX:+UseSpinning参数来开启,在JDK1.6中就已经改为默认开启了。

参考资料:

2.2锁消除

如果JVM明显检测到某段代码是线程安全的(言外之意:无锁也是安全的),JVM会安全地原有的锁消除掉!

比如说:


    public void vectorTest(){
        Vector<String> vector = new Vector<String>();
        for(int i = 0 ; i < 10 ; i++){
            vector.add(i + "");
        }

        System.out.println(vector);
    }

Vector是默认加锁的,但JVM如果发现vector变量仅仅在vectorTest()方法中使用,那该vector是线程安全的。JVM会把vector内部加的锁去除,这个优化就叫做:锁消除。

2.3锁粗化

默认情况下,总是推荐将同步块的作用范围限制得尽量小。

但是如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,频繁地进行互斥同步操作也会导致不必要的性能损耗。

JVM会将加锁的范围扩展(粗化),这就叫做锁粗化。

2.4轻量级锁

轻量级锁能提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。

  • 如果没有竞争,轻量级锁使用CAS操作避免了使用互斥量的开销
  • 但如果存在锁竞争,除了互斥量的开销外,还额外发生了CAS操作,因此在有竞争的情况下,轻量级锁会比传统的重量级锁更慢。

简单来说:如果发现同步周期内都是不存在竞争,JVM会使用CAS操作来替代操作系统互斥量。这个优化就被叫做轻量级锁。

2.5偏向锁

偏向锁就是在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了!

偏向锁可以提高带有同步但无竞争的程序性能。它同样是一个带有效益权衡(Trade Off)性质的优化,也就是说,它并不一定总是对程序运行有利,如果程序中大多数的锁总是被多个不同的线程访问,那偏向模式就是多余的。在具体问题具体分析的前提下,有时候使用参数-XX:-UseBiasedLocking来禁止偏向锁优化反而可以提升性能。

2.6简单总结各种锁优化

  • 自适应偏向锁:自旋时间不固定
  • 锁消除:如果发现代码是线程安全的,将锁去掉
  • 锁粗化:加锁范围过小(重复加锁),将加锁的范围扩展
  • 轻量级锁:在无竞争的情况下使用CAS操作去消除同步使用的互斥量
  • 偏向锁:在无竞争环境下,把整个同步都消除,CAS也不做。

参考资料:

三、TCP粘包,拆包

这是在看wangjingxin大佬面经的时候看到的面试题,之前对TCP粘包,拆包没什么概念,于是就简单去了解一下。

3.1什么是拆包粘包?为什么会出现?

在进行Java NIO学习时,可能会发现:如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况。

TCP的首部格式:

  • TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;
  • 从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段

基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。

一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包

接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包

拆包和粘包的问题导致接收端在处理的时候会非常困难(因为无法区分一个完整的数据包)

3.2解决拆包和粘包

分包机制一般有两个通用的解决方法:

  • 1,特殊字符控制
  • 2,在包头首都添加数据包的长度

如果使用netty的话,就有专门的编码器和解码器解决拆包和粘包问题了。

tips:UDP没有粘包问题,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包。传送的数据单位协议是UDP报文或用户数据报,发送的时候既不合并,也不拆分。

参考资料

四、select、poll、epoll简单区别

NIO回顾:

在Linux下它是这样子实现I/O复用模型的:

调用select/poll/epoll其中一个函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。

这几个函数是有些区别的,可能有的面试官会问到这三个函数究竟有什么区别:

区别如下图:

两句话总结:

  • select和poll都需要轮询每个文件描述符,epoll基于事件驱动,不用轮询
  • select和poll每次都需要拷贝文件描述符,epoll不用
  • select最大连接数受限,epoll和poll最大连接数不受限

tips:epoll在内核中的实现,用红黑树管理事件块

4.1通俗例子

现在3y在公司里边实习,写完的代码需要给测试测一遍。

select/poll情况:

  • 开发在写代码,此时测试挨个问所有开发者,你写好程序了没有?要测试吗?

epoll情况:

  • 开发写完代码了,告诉测试:“我写好代码了,你去测测,功能是XXX”。于是测试高高兴兴去找bug了。

其他通俗描述[1]:

一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就这样一个服务员服务好多人,有时没人喝酒,服务员处于空闲状态,可以干点别的玩玩手机。至于epoll与select,poll的区别在于后两者的场景中醉汉不说话,你要挨个问要不要酒,没时间玩手机了。io多路复用大概就是指这几个醉汉共用一个服务员。

来源:

其他通俗描述[2]:

简单举个例子(可能也不是很形象)select/poll饭店服务员(内核)告诉饭店老板(用户程序):”现在有客人结账“但是这个服务员没人明确告诉老板,哪几桌的客人结帐。老板得自儿一个一个桌子去问:请问是你要结帐?epoll饭店服务员(内核)告诉饭店老板(用户程序):”1,2,5号客人结账“老板就可以直接去1,2,5号桌收钱了

来源:

深入了解参考资料:

五、Java内存模型

JVM博文回顾:

之前在写JVM的时候,还一度把JVM内存结构与Java内存模型给搞混了~~~还好有热心的网友给我指出来。

JVM内存结构:

Java内存模型:

操作变量时的规则:

  • Java内存模型规定了所有的变量都存储在主内存
  • 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝
  • 线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量

从工作内存同步回主内存实现是通过以下的8种操作来完成:

  • lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
  • unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  • read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
  • use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
  • assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
  • store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
  • write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的

保证原子性的操作:

  • read、load、assign、use、store和write
  • synchronized锁

保证有序性(重排序导致无序)的操作:

  • volatile
  • synchronized锁

保证可见性:

  • volatile
  • synchronized锁
  • final

在上面也说了,有序性可以通过volatile和synchronized锁来保证,但我们一般写程序的时候不会总是关注代码的有序性的。其实,我们Java内部中有一个原则,叫做先行发生原则(happens-before)

  • “先行发生”(happens-before)原则可以通过:几条规则一揽子地解决并发环境下两个操作之间是否可能存在冲突的所有问题
  • 有了这些规则,并且我们的操作是在这些规则定义的范围之内。我们就可以确保,A操作肯定比B操作先发生(不会出现重排序的问题)

“先行发生”(happens-before)原则有下面这么几条:

  • 程序次序规则(Program Order Rule):在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。准确地说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。
  • 管程锁定规则(Monitor Lock Rule):一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个锁,而“后面”是指时间上的先后顺序。
  • volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的“后面”同样是指时间上的先后顺序。线程启动规则(Thread Start Rule):Thread对象的start()方法先行发生于此线程的每一个动作。
  • 线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。
  • 线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。
  • 对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。
  • 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。

参考资料:

六、最后

本文简单整理了一下在学习中做的笔记,还有在网上遇到一些比较重要的知识点(面试题)~希望大家看完能有所收益。

参考资料:

  • 《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》

如果大家有更好的理解方式或者文章有错误的地方还请大家不吝在评论区留言,大家互相学习交流~~~

如果想看更多的原创技术文章,欢迎大家关注我的微信公众号:Java3y。Java技术群讨论:742919422。公众号还有海量的视频资源哦,关注即可免费领取。

可能感兴趣的链接:

【数据集】MODIS 的 MOD07 大气廓线产品概述及下载 MODIS 的 MOD07 大气廓线产品概述及下载 阅读详情

相关推荐

ArcGIS License Server点击启动没反应,许可管理器无法启动怎么办

4 当我们再打开ArcGIS License Server Administrator的时候。3 在【服务】中找到【ArcGIS License Manager】双击。无法启动ArcGIS License Server的情况。在使用ArcGIS的过程中,我们经常会遇到。专注GIS领域知识分享,交流行业软件技巧。欢迎关注,不定期分享GIS各种问题和技巧。1 右击我的电脑——【管理】服务状态——启动,确定即可。启动类型选择——自动。

GIS蒲公英的博客 2万+

java3y_Java3y的JAVA入门学习路线

JAVA是个啥?我在学校期间学校把JAVA的课程叫做面向对象编程,弱鸡的我还挂了一次重修才过。以我男理工的实力以课程名就可以看出JAVA的核心思想就是面向对象。一般来说JAVA被称作面向对象编程语言,继承了C艹的诸多优点,摒弃了其中难以理解的指针和多继承。传言在很久很久以前有一个JAVA小岛,盛产咖啡,咖啡也被称作是JAVA,而JAVA语言就是诞生于此,喝杯JAVA压压惊,哈哈。为什么要学习JAV...

weixin_33765593的博客 669

DSH-Work:一个让DeepSeek下载即用的Harness客户端

使用大模型工具时,环境配置往往比模型本身更让人头疼。DeepSeek Harness作为一类封装层,将模型调用、上下文管理、参数控制等复杂细节统一收拢,对外提供简洁操作入口。开源的DSH-Work正是这样一款Harness客户端,它通过自带运行时与保守默认配置,实现了下载即用、免配环境的目标,让使用者无需掌握Python、CUDA等专业知识即可快速连接DeepSeek云端或本地服务。对于非技术背景的用户,它降低了AI工具的使用门槛;对于开发者,它把时间从环境排错中解放出来,更专注于提示词调优与工作流设计。无

weixin_29048309的博客 344

探索Java编程的新境界:`Java3y`项目详解

探索Java编程的新境界:Java3y项目详解 去发现同类优质开源项目:https://gitcode.com/ 在编程的世界里,Java始终占据着重要的地位,尤其对于初学者和职业开发者来说,它是一款强大且易上手的工具。今天,我们要向大家推荐一个名为Java3y的开源项目(),这是一个精心设计的Java学习资源库,旨在帮助开发者提升Java技能,无论你是新手还是老手。 项目简介 Java3y是一个...

gitblog_00044的博客 506

Android无线调试:adb tcpip连接实战指南

本文详细介绍了Android无线调试的完整流程,重点讲解如何使用adb tcpip命令通过Wi-Fi连接设备,摆脱数据线束缚。涵盖环境配置、连接实战、稳定性优化及常见问题排查,帮助开发者高效实现无线adb调试,提升工作效率。

pink的博客 722

别再套用星形公式了!三角形接法PMSM的FOC控制,扇区判断与作用时间推导全解析

本文深入解析三角形接法永磁同步电机(PMSM)的FOC控制技术,重点探讨30度相位差对SVPWM扇区判断与电压矢量作用时间的影响。通过数学推导与实验验证,详细讲解修正后的扇区划分规则、作用时间计算公式优化方法,并提供可直接移植到STM32的代码实现,帮助工程师解决三角形接法特有的相电流重构与同步采样难题。

weixin_30689307的博客 469

Java3y文章目录导航

前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池就是这么简单 ThreadLocal就是这么简单 HTTP+JSON+XML HTTP就是这么简单 HTTP常见面试题 XML就...

weixin_33814685的博客 961

CST Studio Suite安装详细教程(附安装包)CST Studio Suite 2024超详细安装教程

CST Studio Suite 2024安装指南摘要:本文详细介绍了CST Studio Suite 2024电磁仿真软件的下载与安装流程,包含23个图文步骤说明,从解压安装包到配置许可证服务器。重点提示了以管理员身份运行、自定义安装路径等关键步骤,并提供了常见问题解决方案和入门技巧。该软件适用于天线设计、PCB分析等高频电磁场仿真,安装后需通过localhost:27000连接许可证服务器完成激活。

pythonqiang9的博客 1万+

这是一篇java3y的优选文章总结

目录 Java基础: 2018年如何快速学Java: 泛型就这么简单: 注解就这么简单: 数据库连接池就是这么简单: Object对象你真理解了吗? JDK10都发布了,nio你了解多少?: COW奶牛!Copy On Write机制了解一下 给女朋友讲解什么是Optional【JDK 8特性】 还在用Synchronized?Atomic你了解不? JVM如何从入门到放弃的? Java容器 Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表.

Lonely Programmer 8063

SAP SD科目确定:从配置到凭证的财务集成核心

本文深入解析SAP SD科目确定的核心价值与配置实践,涵盖从主数据准备到财务凭证生成的全流程。通过六步配置法和KOFI00过程拆解,帮助企业实现销售与财务模块的高效集成,确保收入、成本等数据准确归集至对应会计科目,提升财务自动化水平与数据准确性。

weixin_33491377的博客 251

10万张数据集持续迭代:YOLO模型的场景专属自进化体系如何搭建?

做工业质检的朋友应该都有过这样的经历——拿着在COCO上刷榜的YOLO模型跑到产线上一测,精度直接腰斩。这不是模型不行,是场景不对口。过去一年,我深度参与了一个工业视觉项目:产线每天产生超过10万张图像,需要持续迭代检测模型。我们踩过无数坑,最终摸索出一套YOLO模型的场景专属自进化体系。今天不聊虚的,直接上干货。让模型在真实场景数据中持续学习、自动进化,而不是每次依赖人工标注从头训练。下面我从主动学习筛选、增量持续学习、架构选型、部署优化、安全防护五个维度,拆解整个搭建过程。声明。

2601_95807009的博客 106

【Java】几道就能让你拿offer的面试题

前言 之前在刷博客的时候,发现一些写得比较好的博客都会默默收藏起来。最近在查阅补漏,有的知识点比较重要的,但是在之前的博客中还没有写到,于是趁着闲整理一下。 文本的知识点: Integer常量池 TCP拆包粘包 select、poll、epoll简单区别 jdk1.6以后对Synchronize锁优化 Java内存模型 本文力求简单讲清每个知识点,希望大家看完能有所收获 一、神奇的Integer 前阵子在群上看有人在讨论关于Integer的true或者false问题,我本以为我已经懂了这方面的知识点了。

237

R语言 百度坐标转换至WGS84坐标

本文利用R语言封装了百度坐标转换至WGS84坐标的函数,亲测有效,提供了便捷的百度坐标转换方法。

qingchen98的博客 2135

【Java】几道让你拿offer的面试题,2024年最新java虚拟机面试题

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。Kafka入门为什么选择KafkaKafka的安装、管理和配置。

2401_84140653的博客 1039

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Java】几道让你拿offer的面试题,2024年最新mysql面试知识

由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,

2401_84023262的博客 769

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

这几道多线程面试题都不会,怎么拿Java大厂的offer?

多线程是Java技术中常用而且相对比较难以理解的一个知识点。而且多线程也是企业实际应用中必备的技术,因此在面试的过程中,面试者经常被问到关于多线程的问题,遇到这些问题大家应该怎么办呢?赶紧跟着我一起来恶补一下Java面试常见关于多线程的面试题吧。 1、进程,线程之间有什么区别? 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立...

xiaoxijing的博客 258

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java redis设置过期时间_这几道 Redis 面试题都不懂,怎么拿 Offer?

缓存雪崩缓存穿透缓存与数据库双写一致最后《Netty 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体设计合集》《Java 面试题 —— 精品合集》《Java 学习指南 —...

weixin_39716921的博客 94

java程序员选择多个offer时需要看重哪些?_27 道阿里巴巴 Java 面试题,你会几道?...

做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。1面试常见问题1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、n...

weixin_39590739的博客 98

java队列应用之售票窗口问题_这几道多线程面试题都不会,怎么拿Java大厂的offer?...

1、为什么用线程池?有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间会比线程真正执行的时间还长。而且当线程数量太多时,系统不一定能受得了。使用线程池主要为了解决一下几个问题:通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等...

weixin_29148445的博客 240

Java面试如何坐等Offer?

毕业季来临,想让面试官在短短的几十分钟内就认可你的能力?想在最快的时间内收获 Java 技术栈最核心的知识点?想要更全面、更深入的了解 Java 技术?这里能够给你想要...

优快云人工智能头条 342
上一篇: HTTP2和HTTPS来不来了解一下?
下一篇: 数据链路层
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值