多线程&高并发(面试题+导图+笔记)面试手稳心不慌!

前言

当你开始开始去跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是凉凉;

现如今市场,多线程、高并发编程、分布式、负载均衡、集群等可以说是现在高级后端开发求职的必备技能。

很多人拥有大厂梦,却因为多线程与高并发败下阵来。实际上,多线程与高并发并不难,今天这份最全的多线程与高并发总结,助你向大厂“开炮”,面试不再被多线程与高并发难倒。

一、多线程与高并发(面试题集合总结)

多线程与高并发面试题(基础部分)

  • 你如何确保main()方法所在的线程是Java程序最后结束的线程?

  • ThreadLocal原理

图片

ThreadLocal内存结构图

  • 什么是死锁(Deadlock)?如何分析和避免死锁?

  • 什么是Java Timer类?如何创建一个有特定时间间隔的任务?

  • 什么是线程池?如何创建一个Java线程池?

  • 什么是并发容器的实现?

  • Executors类是什么?

  • 说说CountDownLatch与CyclicBarrier区别

图片

多线程与高并发面试题(高级进阶部分)

  • 在静态方法上使用同步时会发生什么事?

  • 在一个对象上两个线程可以调用两个不同的同步实例方法吗?

  • Fork/Join框架的理解

图片

  • 什么是死锁

  • volatile 是什么?可以保证有序性吗?

  • CAS?CAS 有什么缺陷,如何解决?

图片

  • Thread 类中的start() 和 run() 方法有什么区别?

  • Java中interrupted 和 isInterruptedd方法的区别?

  • 如何检测死锁?怎么预防死锁?死锁四个必要条件

图片

多线程与高并发面试答案解析

图片

多线程与高并发的关系区别

“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则高并发 ≠ 多线程

1.多线程

多线程是java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间运行。

再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。

总之,多线程即可以这么理解:多线程是处理高并发的一种编程方法,即并发需要用多线程实现。

2.高并发

高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。

典型的场景,例如:12306抢火车票,天猫双十一秒杀活动等。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。

如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。

以下是为多线程与高并发整理的面试核心内容,涵盖高频考点、知识导图与实用笔记,帮助系统化掌握关键概念。


高频面试题精析

线程与进程区别
进程是资源分配的最小单位,线程是CPU调度的最小单位。同一进程的线程共享内存空间,而进程间内存独立。

线程生命周期状态
新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。注意阻塞状态可能由synchronizedwait()或I/O操作触发。

synchronized底层原理
通过对象头Mark Word中的锁标志位实现,包含偏向锁、轻量级锁、重量级锁升级过程。JVM自动优化锁竞争。

volatile关键字作用
保证可见性与禁止指令重排,但不保证原子性。底层通过内存屏障(Memory Barrier)实现。

CAS(Compare-And-Swap)机制
无锁算法核心,依赖Unsafe类直接操作内存。存在ABA问题,可通过版本号(如AtomicStampedReference)解决。

ThreadLocal原理与内存泄漏
每个线程持有ThreadLocalMap独立副本,需手动remove()避免key弱引用导致的内存泄漏。

线程池参数与拒绝策略
核心参数:corePoolSizemaxPoolSizekeepAliveTimeworkQueue。拒绝策略含AbortPolicy(默认)、CallerRunsPolicy等。

AQS(AbstractQueuedSynchronizer)
构建锁的框架,如ReentrantLock。通过CLH队列和state变量实现同步,支持公平与非公平模式。


知识导图核心要点

graph TD
    A[多线程] --> B[线程安全]
    A --> C[线程通信]
    B --> D[synchronized]
    B --> E[volatile]
    B --> F[JUC原子类]
    C --> G[wait/notify]
    C --> H[Condition]
    A --> I[线程池]
    I --> J[参数配置]
    I --> K[工作流程]


实战笔记摘要

避免死锁的四种方法

  • 固定锁获取顺序
  • 使用尝试锁(tryLock
  • 设置超时时间
  • 死锁检测算法

ConcurrentHashMap优化点
JDK8改用数组+链表/红黑树结构,锁粒度细化到桶级别,并发度由volatileCAS保证。

CompletableFuture使用场景
异步任务编排,支持链式调用与组合操作(如thenApplythenCombine),替代传统Future回调地狱。

高并发设计模式

  • 生产者-消费者(阻塞队列实现)
  • 读写锁(ReadWriteLock
  • 线程本地存储(ThreadLocal

推荐工具与源码阅读

  • 工具:jstack分析线程状态,Arthas在线诊断
  • 源码:java.util.concurrent包下的ThreadPoolExecutorConcurrentHashMap

掌握以上内容可应对90%以上多线程高频面试问题,建议结合代码实践加深理解。

关于多线程与高并发的实际应用

Java 高并发编程详解:多线程与架构设计

第一部分:多线程基础

主要阐述 Thread 的基础知识,详细介绍线程的 API 使用、线程安全、线程间数据通信,以及如何保护共享资源等内容,它是深入学习多线程内容的基础。

图片

图片

第二部分:Java ClassLoader

引入了 ClassLoader,这是因为 ClassLoader 与线程不无关系,我们可以通过 synchronized 关键字,或者 Lock 等显式锁的方式在代码的编写阶段对共享资源进行数据一致性保护,那么一个 Class 在完成初始化的整个过程到后在方法区(JDK8 以后在元数据空间)其数据结构是怎样确保数据一致性的呢?这就需要对 ClassLoader 有一个比较全面的认识和了解。

第三部分:深入理解volatile关键字

第三部分详细、深入地介绍 volatile 关键字的语义,volatile 关键字在 Java 中非常重要,可以说它奠定了 Java 核心并发包的高效运行,在这一部分中,我们通过实例展示了如何使用 volatile 关键字以及非常详细地介绍了 Java 内存模型等知识。

图片

第四部分:多线程设计架构模式

站在程序架构设计的角度深入讲解了如何设计高效灵活的多线程应用程序,这一部分长达15个章节,其重要程度可见一斑。

图片

图片

图片

《多线程与高并发》

第一节:线程的基本概念

第二节:volatile与CAS

第三节:Atomic类和线程同步新机制

第四节:LockSupport、淘宝面试题与源码阅读方法论

第五节:AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码

第六节:并发容器

第七节:线程池

第八节:线程池与源码阅读

第九节:JMH与Disruptor

图片

图片

结束语

总的来说,自己如果有想要去的大公司,一定要提升好自己,让自己的能力和素质与公司匹配的上,我也一直相信,机会永远是留给有准备的人。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

<think>好的,我现在需要回答用户关于如何使用Jupyter Notebook进行船体重心计算和稳定性分析的问题。首先,我得回忆一下相关的步骤和概念,确保信息的准确性。 用户提到了重心计算和稳定性分析,这两个都是船舶设计中的重要部分。重心计算通常涉及到确定船舶各部分的质量分布,找到整体的重心坐标。而稳定性分析可能需要计算稳心高度,判断船舶是否会倾覆。我需要先确定基本的物理公式,比如重心的计算公式是各部分的力矩之和除以总质量。稳心高度则是通过稳心与重心的距离来判断稳定性,如果稳心高于重心,船舶就是稳定的。 接下来,用户想用Jupyter Notebook来实现这些计算。Jupyter Notebook适合交互式计算和文档编写,所以需要指用户如何搭建环境。根据引用[2],启动Jupyter Notebook是通过命令行输入jupyter notebook,但用户可能已经知道这一点。不过可能需要提醒安装必要的库,比如NumPy、Pandas和Matplotlib,这些在数据处理和可视化中常用。 然后,具体步骤可能需要分阶段。首先是数据准备,用户需要输入船舶各部分的质量和坐标。这部分可以用Pandas的DataFrame来处理,方便存储和计算。然后是重心计算,即计算各分力矩之和除以总质量,得到重心坐标。接下来是稳定性分析,需要计算稳心位置,通常稳心的位置与船体形状有关,可能需要水线面惯性矩和排水体积等参数。这部分可能需要用户提供更多船舶的几何数据,比如水线面面积、吃水深度等。 在代码示例方面,应该展示如何用Python实现这些计算。比如,用Pandas读取数据,计算总质量和重心坐标。然后,假设稳心高度公式为BM = I / V,其中I是水线面惯性矩,V是排水体积。用户需要输入这些参数,或者通过其他方式计算出来。之后,比较稳心高度和重心高度,判断稳定性。 可能还需要考虑可视化,比如用Matplotlib绘制船舶的剖面,标出重心和稳心的位置,这样更直观。但用户的问题可能不需要复杂的形,所以示例代码可能简化这部分。 需要注意的是,用户可能对船舶的某些参数不太清楚,比如如何获取水线面惯性矩。这时候可能需要说明这些参数通常来自船舶设计纸或通过其他计算方法获得,或者假设用户已经具备这些数据。 另外,引用文献中的内容需要正确标注。例如,引用[1]提到Jupyter Notebook用于交互计算,引用[2]和[3]关于启动和在PyCharm中使用的方法,但用户的问题更多是关于应用,所以引用可能主要用于说明Jupyter的环境搭建部分。 最后,生成相关问题时要围绕船舶计算、Jupyter的应用、稳定性分析的深入方法等。比如,如何处理更复杂的船体形状,或者如何自动化数据输入,这些都可能成为相关的问题。</think>### 使用 Jupyter Notebook 计算船体重心及稳定性分析的方法 #### 1. 环境准备 - 启动 Jupyter Notebook:在命令行输入 `jupyter notebook`,创建新笔记本[^2]。 - 安装必要库(在代码单元格中执行): ```python !pip install numpy pandas matplotlib ``` #### 2. 数据准备 假设船体由多个部件组成,每个部件有质量 $m_i$ 和三维坐标 $(x_i, y_i, z_i)$: ```python import pandas as pd data = { "部件名称": ["甲板", "引擎", "货舱"], "质量(kg)": [5000, 8000, 12000], "x(m)": [10, 5, 8], "y(m)": [0, -1, 0.5], "z(m)": [3, 2, 4] } df = pd.DataFrame(data) ``` #### 3. 重心计算 重心坐标公式: $$ x_{\text{重心}} = \frac{\sum m_i x_i}{\sum m_i}, \quad y_{\text{重心}} = \frac{\sum m_i y_i}{\sum m_i}, \quad z_{\text{重心}} = \frac{\sum m_i z_i}{\sum m_i} $$ 代码实现: ```python total_mass = df["质量(kg)"].sum() x_cg = (df["质量(kg)"] * df["x(m)"]).sum() / total_mass y_cg = (df["质量(kg)"] * df["y(m)"]).sum() / total_mass z_cg = (df["质量(kg)"] * df["z(m)"]).sum() / total_mass print(f"重心坐标: ({x_cg:.2f}, {y_cg:.2f}, {z_cg:.2f}) m") ``` #### 4. 稳定性分析 **稳心高度(GM)公式**: $$ GM = KM - KG $$ 其中: - $KM$ 为稳心高度(由船体形状决定) - $KG$ 为重心高度($z_{\text{重心}}$) **稳定性判断**: - 若 $GM > 0$,船舶稳定 - 若 $GM \leq 0$,存在倾覆风险 代码实现(假设已知 $KM=5.2$ m): ```python KM = 5.2 # 需根据船型计算或实验获取 GM = KM - z_cg print(f"稳心高度 GM = {GM:.2f} m") print("稳定" if GM > 0 else "不稳定") ``` #### 5. 可视化(可选) 绘制重心位置示意: ```python import matplotlib.pyplot as plt plt.figure(figsize=(8,4)) plt.scatter(df["x(m)"], df["z(m)"], s=df["质量(kg)"]/100, label="部件") plt.scatter(x_cg, z_cg, c='red', marker='*', s=200, label='重心') plt.xlabel("纵向位置 (m)") plt.ylabel("垂向高度 (m)") plt.legend() plt.grid(True) plt.show() ``` #### 注意事项 - 实际应用中需考虑浮心、水线面惯性矩等参数[^1] - 复杂船体需使用三维积分或专业软件辅助计算 - 可通过 PyCharm Professional 集成 Jupyter Notebook 进行开发[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值