《全面解析 Java、MySQL、数据结构及 MES 系统核心知识,码农必备!》:“全面解析” 突出内容丰富,“码农必备” 让目标读者觉得文章对自身有重要价值。

深入剖析 Java、MySQL 及相关技术核心要点

在当今的软件开发领域,Java、MySQL 以及相关技术广泛应用于各类项目中。深入理解这些技术的核心要点,对于开发者提升技术水平、解决实际问题至关重要。本文将围绕提供的知识点,对多线程、JVM、MySQL、数据结构以及 MES 系统相关内容进行详细阐述。

一、多线程:高效并发的基石

多线程技术是 Java 语言的一大亮点,它使得程序能够在同一时间执行多个任务,极大地提高了程序的运行效率。

(一)并发与并行

并发指多个任务同时发起,但在单 CPU 环境下,无法真正同时执行,而是通过 CPU 在不同任务间快速切换,让用户感觉任务同时执行。并行则是多个任务在多个 CPU 的支持下,在某一时刻真正同时执行。

(二)线程池

线程池是管理和复用线程的重要工具。可缓存线程池(CachedThreadPool)能按需创建和回收线程,但任务过多时会增加系统开销;固定长度线程池(FixedThreadPool)创建固定数量线程,多余任务进入阻塞队列,线程空闲时仍占用资源;单线程线程池(SingleThreadExecutor)仅用一个线程处理任务;定时线程池(ScheduledThreadPool)可按指定时间执行任务 。

线程池的核心参数包括核心线程数量(corePoolSize)、最大线程数量(maxPoolSize)、空闲队列回收时间(keepAliveTime)和阻塞队列(BlockingDeque)。其工作原理是先使用核心线程执行任务,任务超出核心线程数量时进入阻塞队列,队列满后创建非核心线程处理任务,当线程总数超过最大线程数时触发拒绝策略 。

线程池提供了四种拒绝策略:AbortPolicy 直接抛出异常;CallerRunsPolicy 重试并尝试加入任务;DiscardOldestPolicy 抛弃最老的任务加入新任务;DiscardPolicy 抛弃正在执行的最新任务加入新任务。

(三)多线程安全问题及解决方法

多线程环境下,数据竞争等安全问题频发。同步代码块(synchronized)、同步方法(synchronized)、同步锁(ReenreantLock)、特殊域变量(volatile)、局部变量(ThreadLocal)、阻塞队列(LinkedBlockingQueue)和原子变量(Atomic*)等技术,从不同角度保障了多线程安全 。

可重入锁允许线程在递归调用时重复获取锁资源。Synchronized 锁会经历无锁、偏向锁、轻量级锁(自旋锁)到重量级锁的升级过程,以适应不同的并发场景 。

与 Synchronized 相比,Lock(ReenTrantLock)是 Java 类,可判断是否获取到锁,需手动释放锁,还可指定公平锁或非公平锁 。

手写分布式锁可利用 Redis 的单线程和原子性,借助 SETNX 命令实现。为防止死锁,需设置过期时间,同时可通过在 value 中设置线程 id 和时间戳避免其他线程误删。在项目中,Redisson 框架基于 Redis 的 setnx 命令实现分布式锁,并提供看门狗机制防止锁提前失效 。

CountDownLatch 可使一个线程等待其他线程完成工作后再执行,底层通过计数器实现。wait () 和 sleep () 方法分别来自 Object 类和 Thread 类,wait () 会释放对象锁,而 sleep () 不会;wait () 需配合 notify () 或 notifyAll () 使用,而 sleep () 指定时间后自动唤醒 。Notify 唤醒一个线程,notifyAll 唤醒所有线程。使用 join () 方法可保证线程顺序执行 。

Juc 包(java.util.concurrent )提供了丰富的组件,如线程安全的 ConcurrentHashMap、用于线程同步的 CountDownLatch、创建线程池的 Executors 和同步锁 ReentrantLock 等 。原子类操作基于 CAS 算法,能在多线程环境下实现原子性操作 。Volatile 关键字保证共享变量的可见性和禁止指令重排序,但不保证原子性。ThreadLocal 为每个线程维护共享变量的副本,常用于数据库连接、登录等场景,但存在内存泄露风险 。通过 Aop 实现多数据源切换,可在 yml 文件中配置多个数据源,借助自定义注解和切面类实现数据源的动态切换 。

二、JVM:Java 程序的运行核心

JVM(Java 虚拟机)是 Java 程序运行的基础,理解 JVM 的原理和机制对于优化程序性能、排查问题至关重要。

(一)JVM 模式与变量

JVM 有 Server 和 client 两种模式。Java 变量根据类型和作用域不同,存储在不同区域,如成员变量存于堆内存,静态变量存于方法区,常量存于常量池,局部变量存于栈内存 。

(二)类加载机制

类加载过程包括加载、链接(验证、准备、解析)和初始化。类加载器有启动引导类加载器(加载 rt.jar 包)、扩展类加载器(加载 ext 包下的 jar 包)和应用程序类加载器(加载自定义类) 。双亲委派机制保证类的唯一性和 JVM 的安全性,加载类时先委托父类加载,父类无法加载时子类加载器才尝试加载 。

(三)JVM 内存模型

JVM 内存模型包含程序计数器、虚拟机栈、本地方法栈、方法区和堆。程序计数器和虚拟机栈是线程私有的,线程安全;方法区和堆被多个线程共享 。内存溢出指程序申请内存时无足够内存可用,内存泄漏则是程序申请的内存未被释放 。

(四)垃圾回收机制

GC(垃圾回收)通过可达性分析算法确定垃圾对象,避免引用计数算法的循环引用问题。常见的垃圾回收算法有标记清除算法、复制回收算法、标记整理算法,Java 采用分代收集算法,将堆内存分为新生代和老年代,分别采用不同的回收算法 。常见的垃圾回收器有 Serial、ParNew、Parallel、serial old、parallel old、CMS 和 G1 等,它们各有特点和适用场景 。

(五)JVM 调优与参数

JVM 调优可通过命令和工具排查生产环境中的卡顿、CPU 加载高、OOM 等问题。常用的 JVM 参数包括设置堆大小的 -Xms、-Xmx,设置新生代大小的 -XX:NewSize、 -XX:MaxNewSize,以及设置新生代和老年代比值的 -XX:NewRatio 等 。

(六)代码优化与开发规范

代码优化旨在减小体积、提高速度,如重用对象、使用局部变量、及时关闭流、使用连接池和线程池等 。遵循代码开发规范能提高代码的可读性和可维护性,如类名、方法名等的命名规范,布尔变量的命名注意事项,以及包装类对象比较的规范等 。

三、MySQL:强大的关系型数据库

MySQL 是广泛使用的关系型数据库,掌握其核心知识对于高效开发数据库应用至关重要。

(一)基础操作与函数

MySQL 提供了丰富的操作关键字,如修改表结构的 alter table、分页的 limit、创建索引的 create index 等 。同时,拥有数值、字符串、日期、聚合和流程控制等各类函数,满足不同的业务需求 。

(二)存储引擎

MyIsam 存储引擎独立于操作系统,创建表时会生成三个文件,不支持事务和外键,查询速度快,但表锁机制在读写频繁时效率低 。InnoDB 存储引擎适合增删改多的表,支持事务、外键约束和主键自增,可从灾难中恢复 。

(三)索引

索引从物理上分为聚簇索引和非聚簇索引,从逻辑上分为主键索引、唯一索引、普通索引和全文索引,从作用字段上分为单列索引和联合索引 。聚簇索引根据主键构造 B + 树,叶子节点存储行记录数据;非聚簇索引叶子节点存储数据位置 。回表查询是使用非聚簇索引查询时,先找到聚簇索引再查询其他字段的过程;覆盖索引则是查询数据都在索引 B + 树上,无需回表查询 。建索引时需综合考虑字段使用频率、数据量、数据重复性等因素 。

(四)数据库锁与事务

数据库锁从物理层面分为共享锁和排他锁,从粒度上分为行级锁和表级锁,不同类型的锁适用于不同的并发场景 。事务具有原子性、一致性、隔离性和持久性,其传播特性定义了事务在不同方法间的行为,隔离级别则控制了事务之间的可见性 。并发情况下可能出现脏读、不可重复读和幻读等问题 。

(五)SQL 优化

SQL 优化可通过开启慢日志定位需要优化的 SQL 语句,借助 explain 关键字查看执行计划,分析 type 字段、possible_key、key、rows 和 filtered 等信息,进而优化 SQL 语句,如避免全表扫描、遵循最左前缀原则、减少函数计算等 。

四、数据结构:算法与程序的基础

数据结构是算法实现的基础,合理选择数据结构能显著提升程序性能。

(一)二叉树、B 树与 B + 树

二叉树每个节点最多有两个子节点,适合小数据量内存存储。B 树节点存储元素增多,树高降低,IO 次数减少。B + 树根节点和分支节点只存储索引,叶子节点存储数据且有序,更适合范围查询 。

(二)HashMap 底层原理

HashMap 底层采用数组、单链表和红黑树实现。默认数组大小为 16,负载因子为 0.75,这是时间和空间的折中选择。当元素个数达到负载因子阈值时自动扩容,哈希冲突时通过单链表存储,单链表长度超过 8 且数组长度超过 64 时转换为红黑树 。put 流程先对 key 进行哈希运算,再根据数组查找元素,根据不同情况进行插入、覆盖或添加到红黑树、单链表的操作 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值