java中小型公司面试预习资料(一):基础篇

基础篇

  • 前言
    • 一、线程
    • 二、JUC包
    • 三、CAS和AQS
    • 四、线程池
    • 四、jvm GC
    • 五、锁
    • 五、淘汰策略

前言

博主也非常不想看一些有用没有的八股文,但是大部分公司面试这个是必须的,不然面试官可能都不知道拿什么区判定你的编程功底。so~,我整理了一部分还算有用的,自用也是分享。

一、线程

  1. 定义一个继承Thread类的子类,重写run()方法,编写线程执行的逻辑,创建子类实例,调用其start()方法启动线程(而非直接调用run()方法)。简单直观,但Java是单继承语言,继承Thread类会占用类的继承权。
  2. 定义一个实现Runnable接口的类,实现run()方法,定义线程逻辑,创建该类的实例,并将其作为参数传递给Thread类的构造函数,调用Thread对象的start()方法启动线程。更灵活,允许类继承其他父类。
  3. 使用Callable和Future,定义一个实现Callable接口的类(泛型指定返回值类型)。实现call()方法,编写线程逻辑并返回结果。创建FutureTask对象包装Callable实例。将FutureTask作为参数创建Thread对象,并启动线程。通过FutureTask.get()获取线程执行结果。支持返回值,且能捕获线程执行中的异常。
  4. 通过Executors工厂类创建线程池(如newFixedThreadPool、newCachedThreadPool等)。提交任务到线程池(支持Runnable或Callable任务)。关闭线程池(调用shutdown()或shutdownNow())。减少线程创建和销毁的开销,适合高并发场景。

二、JUC包

java.util.concurrent,这是Java并发编程的核心工具包。
介绍:JUC主要分为atomic、locks和concurrent包下的其他类。atomic和locks包,分别使用CAS和AQS技术。Atomic包提供原子操作类,比如AtomicInteger,而locks包提供了显式锁,如ReentrantLock。原子类解决单个变量的线程安全问题,而锁机制比synchronized更灵活。concurrent下还有线程池、并发容器和同步工具等。

JUC主要包含以下模块:

  1. 原子类(Atomic包):
    基于CAS(Compare-and-Swap)机制,提供线程安全的原子操作类,如AtomicInteger、AtomicLong等,适用于单个变量的线程安全场景。原子类分为基本类型、数组类型、引用类型、字段更新类型和累加器(如LongAdder)。

  2. 锁机制(Locks包):
    提供显式锁(如ReentrantLock、ReadWriteLock),基于AQS(AbstractQueuedSynchronizer)实现,支持更灵活的锁操作(如尝试获取锁、超时机制),优于传统的synchronized关键字。

  3. 并发容器:
    包括线程安全的集合类,如ConcurrentHashMap(分段锁实现)、CopyOnWriteArrayList(写时复制),以及阻塞队列(如ArrayBlockingQueue、LinkedBlockingQueue),用于高效的多线程数据共享。

  4. 线程池(Executor框架):
    通过ExecutorService、ThreadPoolExecutor等类管理线程生命周期,减少线程创建/销毁开销,支持任务调度和异步执行。

  5. 同步工具类:
    如CountDownLatch(闭锁,等待多线程完成)、CyclicBarrier(栅栏,线程同步等待)、Semaphore(信号量,控制资源访问),用于协调线程间的协作。

三、CAS和AQS

  1. AQS(AbstractQueuedSynchronizer)
    AQS 是Java并发包(java.util.concurrent)的底层框架,用于构建锁和同步器(如 ReentrantLock、Semaphore)。
    其核心思想是:
    同步状态(state) :通过 volatile int state 表示共享资源的状态(如锁是否被占用)。
    CLH队列:通过双向队列(FIFO)管理等待线程,避免竞争。
    核心方法:
    独占模式(如 ReentrantLock):
    acquire(int arg):获取资源(如加锁)。
    release(int arg):释放资源(如解锁)。
    共享模式(如 Semaphore):
    acquireShared(int arg):获取共享资源。
    releaseShared(int arg):释放共享资源。
    开发者需实现的关键方法:
    tryAcquire(int):尝试获取独占资源。
    tryRelease(int):尝试释放独占资源。
    tryAcquireShared(int):尝试获取共享资源。
    tryReleaseShared(int):尝试释放共享资源。
    特点:
    模板方法模式:AQS定义算法骨架,子类实现具体逻辑。
    支持公平/非公平锁:通过队列管理实现公平性。
    线程阻塞与唤醒:通过 LockSupport.park() 和 LockSupport.unpark() 控制线程状态。

  2. CAS(Compare-And-Swap)
    CAS 是一种无锁(Lock-Free)的原子操作,用于实现多线程环境下的变量更新。
    其核心操作基于以下三个参数:
    内存地址(V) :需要更新的变量地址。
    预期原值(A) :线程认为变量当前的值。
    新值(B) :希望将变量更新为的值。
    操作逻辑:只有当 V 的值等于 A 时,才会将 V 的值修改为 B。整个过程是原子的,由底层硬件(如CPU的CMPXCHG指令)保证。
    优点:
    无锁化:避免线程阻塞和上下文切换,性能高。
    轻量级:适用于低竞争场景(如计数器、状态标志)。
    缺点:
    ABA问题:变量可能被其他线程从A改为B再改回A,CAS无法感知中间变化。
    解决方案:使用 AtomicStampedReference 添加版本号。
    自旋开销:高竞争下CAS失败重试可能导致CPU空转。
    仅支持单一变量:无法保证多个变量的原子性操作。

CAS:提供无锁化的原子操作,是构建高性能并发工具的基础。
AQS:通过队列和状态管理,为复杂同步工具提供标准化实现框架。
两者共同构成了Java并发编程的核心,CAS负责微观的原子操作,AQS负责宏观的线程同步。

四、线程池

  1. 线程池类型
    FixedThreadPool适合稳定的并发负载。
    CachedThreadPool适合处理大量短期异步任务。
    ScheduledThreadPool用于定时任务。
    SingleThreadExecutor用于需要顺序执行任务的场景。
  2. 线程池参数
    常见的核心参数包括corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory和handler。
    corePoolSize(核心线程数)
    线程池中保持的最小线程数,即使空闲也不会被销毁。初始化时线程数为0,任务提交后逐步创建,直到达到corePoolSize。
    作用:保证系统有基本线程处理任务,避免频繁创建线程的开销。
    默认行为:可通过配置allowCoreThreadTimeOut(true)让核心线程超时回收。

maximumPoolSize(最大线程数)
线程池允许创建的最大线程数,包括核心线程和非核心线程。当任务队列已满且当前线程数小于此值时,会创建新线程处理任务。
作用:应对突发任务高峰,防止任务堆积。

keepAliveTime(线程空闲存活时间)
非核心线程(或允许回收的核心线程)在空闲时的存活时间,超时后会被销毁。

unit(单位)
通过unit参数指定(如秒、毫秒)。
作用:避免资源浪费,动态调整线程数量。

workQueue(任务队列)
用于缓存等待执行的任务,必须是阻塞队列(BlockingQueue)。
常见类型:
有界队列(如ArrayBlockingQueue):防止任务无限堆积,但可能导致任务被拒绝。
无界队列(如LinkedBlockingQueue):可能导致内存溢出,但保证任务不被拒绝。
同步移交队列(如SynchronousQueue):不存储任务,直接创建新线程处理,适用于高吞吐场景。

threadFactory(线程工厂)
自定义线程的创建方式,可设置线程名称、优先级、守护线程等,便于监控和调试。
默认实现:Executors.defaultThreadFactory()。

handler(拒绝策略)
当线程池和队列均满时,处理新提交任务的策略。JDK内置四种策略:
AbortPolicy(默认) :抛出RejectedExecutionException异常。
CallerRunsPolicy:由提交任务的线程直接执行任务。
DiscardOldestPolicy:丢弃队列中最旧的任务,重新提交新任务。
DiscardPolicy:静默丢弃新任务,不抛异常。
自定义策略:实现RejectedExecutionHandler接口,如记录日志或降级处理。

四、jvm GC

首先,调优的原则方面,多数Java应用不需要GC调优,问题多出在代码而非参数。(核心原则是优先优化代码,再调整JVM参数)
Minor GC: 针对新生代(Young Generation)的回收,当Eden区满时触发,存活对象会被复制到Survivor区或晋升到老年代(Old Generation)
Full GC: 对整个堆(新生代、老年代、元空间/永久代)进行回收,触发条件包括老年代空间不足、显式调用System.gc()等,应尽量减少其频率
算法: 标记-清除、标记-整理、复制算法,不同回收器组合使用这些算法
调优前提: 当GC时间过长(如Minor GC >50ms,Full GC >1秒)或频率过高(如Full GC间隔<10分钟)时需优化
监控与分析工具:
!jstat -gc :实时查看GC次数、时间及内存分布
!jmap生成堆转储文件,结合MAT分析内存泄漏
!GC日志:通过-Xloggc: -XX:+PrintGCDetails输出日志,使用GCViewer或GCeasy可视化分析
部分参数:

通用:-Xms4g -Xmx4g           # 堆内存固定4G-XX:NewRatio=2          # 新生代:老年代=1:2-XX:SurvivorRatio=8     # Eden:Survivor=8:1:1-XX:+UseG1GC            # 启用G1回收器-XX:MaxGCPauseMillis=200 # 目标最大停顿时间-XX:+PrintGCDetails -Xloggc:/path/to/gc.log  # 输出详细GC日志
G1-XX:InitiatingHeapOccupancyPercent=45  # 堆占用45%时启动并发GC-XX:G1HeapWastePercent=5               # 允许5%的堆空间浪费
CMS-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=75   # 老年代75%时触发CMS-XX:+UseCMSCompactAtFullCollection     # Full GC后压缩内存

五、锁

  1. synchronized
    通过字节码指令 monitorenter 和 monitorenterexit 实现。
    可修饰方法(类锁/实例锁)或代码块(指定锁对象)。

  2. ReentrantLock
    支持公平/非公平模式,提供 tryLock()、lockInterruptibly() 等灵活方法。
    需手动释放锁,建议在 finally 中调用 unlock()。

  3. ReadWriteLock
    读写分离:写锁独占,读锁共享(如 ReentrantReadWriteLock)。
    适用场景:如缓存系统(读多写少)。

  4. Semaphore
    控制并发线程数(如数据库连接池)。

五、淘汰策略

LRU(Least Recently Used) : 淘汰最久未访问的数据,适合热点数据场景。
LFU(Least Frequently Used) : 淘汰使用频率最低的数据,适合长周期缓存。
FIFO(First In First Out) : 按写入顺序淘汰,适合时效性强的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28925.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自学Linux系统软件编程第八天

并发服务器&#xff1a; 服务器在同一时刻可以响应多个客户端的请求。 UDP&#xff1a;无连接 单循环服务器&#xff1a;服务器同一时刻只能响应一个客户端的请求。 TCP&#xff1a;有连接 构建TCP并发服务器&#xff1a; 让TCP服务端具备同时响应多个客户端的能力。 方法…

FusionInsight MRS云原生数据湖

FusionInsight MRS云原生数据湖 1、FusionInsight MRS概述2、FusionInsight MRS解决方案3、FusionInsight MRS优势4、FusionInsight MRS功能 1、FusionInsight MRS概述 1.1、数据湖概述 数据湖是一个集中式存储库&#xff0c;允许以任意规模存储所有结构化和非结构化数据。可以…

.NET 10首个预览版发布:重大改进与新特性概览!

前言 .NET 团队于2025年2月25日发布博文&#xff0c;宣布推出 .NET 10 首个预览版更新&#xff0c;重点改进.NET Runtime、SDK、Libraries 、C#、ASP.NET Core、Blazor 和.NET MAUI 等。 .NET 10介绍 .NET 10 是 .NET 9 的后继版本&#xff0c;将作为长期支持维护 &#xff…

HTTP 黑科技

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

C++20 模块:告别头文件,迎接现代化的模块系统

文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…

计算光学成像与光学计算概论

计算光学成像所涉及研究的内容非常广泛&#xff0c;虽然计算光学成像的研究内容是发散的&#xff0c;但目的都是一致的&#xff1a;如何让相机记录到客观实物更丰富的信息&#xff0c;延伸并扩展人眼的视觉感知。总的来说&#xff0c;计算光学成像现阶段已经取得了很多令人振奋…

安铂克科技 APPH 系列相位噪声分析仪:高性能测量的卓越之选

在当今的电子测量领域&#xff0c;对于信号源及各类设备的精确评估至关重要。安铂克科技的 APPH 系列相位噪声分析仪&#xff08;亦称作相噪仪、相位噪声测量仪、信号源分析仪&#xff09;&#xff0c;凭借其超凡的性能与全面的功能&#xff0c;成为众多工程师与科研人员的理想…

算法探秘:盛最多水的容器问题

目录 一、问题引入 二、示例剖析 三、暴力解法与困境 四、双指针法&#xff1a;优雅的解决方案 五、总结 一、问题引入 在算法的奇妙世界里&#xff0c;常常会遇到各种有趣又富有挑战性的问题&#xff0c;“盛最多水的容器”就是其中之一。想象一下&#xff0c;有一系…

QTday4

1:是进度条通过线程自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class mythread : public QThread {Q_OBJECT public:mythread(QObject* parent nullptr); protected:virtual void run() override; private: signals:virtual voi…

PPT小黑第26套

对应大猫28 层次级别是错的&#xff0c;看着是十页&#xff0c;导入ppt之后四十多页 选中所有 红色蓝色黑色 文本选择标题&#xff1a;选择 -格式相似文本&#xff08;检查有没有漏选 漏选的话 按住ctrl 点下一个&#xff09; 要求新建幻灯片中不包含原素材中的任何格式&…

transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3

目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…

Spring编写单元测试的工具介绍:JUnit、Mockito、AssertJ

背景&#xff1a; 在Spring应用程序中&#xff0c;想要通过代码走查做好测试左移&#xff0c;单元测试是确保代码质量和功能正确性的关键。除了我们常用的TestNG外&#xff0c;本次介绍一下其他常见的单元测试工具: JUnit、Mockito、AssertJ&#xff0c;来提高我们做白盒测试的…

Kubermetes 部署mysql pod

步骤 1: 创建 PersistentVolume 和 PersistentVolumeClaim 首先为 MySQL 创建一个 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来确保数据的持久性。 mysql-pv.yaml&#xff1a; apiVersion: v1 kind: PersistentVolume metadata:name: mysql-pv-volume spec:cap…

论坛社区基础版【项目测试报告】

文章目录 一、项目背景二、项目功能用户注册/登录帖子列表页发布帖子个人中心 三、测试工具和环境四、测试计划非功能测试用例功能测试用例部分人工手动测试截图web自动化测试测试用例代码框架 配置内容代码文件&#xff08;Utils.py&#xff09;注册页面代码文件&#xff08;R…

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么&#xff1f;什么是MQTT&#xff1f;为什么说MQTT是适用于物联网的协议&#xff1f;MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …

如何面向DeepSeek编程,打造游戏开发工具集,提升工作效率

最近我在思考&#xff1a; 如何基于DeepSeek&#xff0c;来提升工作效率&#xff0c;构建高效游戏开发工作流。 方向有两个: A: 基于DeepSeek私有代码框架&#xff0c;让它完成项目代码的续写; B: 基于DeepSeek来创作一些工具&#xff0c;使用工具来提升效率&#xff0c;如…

云原生机密计算:构建基于可信执行环境的数据安全堡垒

引言&#xff1a;数据计算的最后一道防线 蚂蚁集团金融级机密计算平台承载日均20亿次敏感交易&#xff0c;密钥泄露风险降低99.97%。微软Azure DCsv3系列虚拟机实现SGX全内存加密性能损耗<15%&#xff0c;Google Anthos Confidential将跨云数据传输成本压缩45%。Gartner预测…

通用文件模型

一、通用文件模型 通常一个完整的Linux系统有数千到数百万个文件组成&#xff0c;文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组。 1.ReiserFS(新型的文件系统) -->Reiser4 它通过一种与众不同的方式----完全平衡树来容纳数据&#xff0c;包…

产品管理过程-思维导图

产品管理过程 1. 市场调研 与用户交流与直接面对客户的一线同事如销售、客服、技术支持等交流市场研究报告分析竞争对手分析用户数据分析 2. 需求管理 需求来源管理 市场需求内部需求运营需求战略需求其它需求 需求版本管理 需求分配管理 需求跟踪管理 3. 产品规划 市…

EtherNet/IP转Modbus解析基于网关模块的罗克韦尔PLC与Modbus上位机协议转换通讯案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 AB PLC&#xff0c;但需要控制的变频器仅支持 Modbus 协议。为了实现 AB PLC 对变频器的有效控制与监控&#xff0c;引入了捷米特 JM-EIP-RTU 网…