什么是线程?什么是进程?进程是系统资源分配的基本单位,拥有独立的内存空间,不同进程之间可以并发执行,创建新进程需要分类独立的内存空间和系统资源,成本高。一个进程的崩溃不会影响其他进程
线程是进程中的一个执行单元,是cpu调度的基本单位,共享所属进程的资源,只拥有自己的栈和寄存器;同一个进程内可以有多个线程并发执行,创建新线程成本低。一个线程崩溃可能导致整个进程崩溃。
Java创建线程有哪几种方式继承自Thread类
定义类继承Thread类。
重写run()方法,定义线程执行体。
创建子类对象并调用start()方法启动线程。
class MyThread extends Thread { public void run() { // 线程执行的逻辑 System.out.println("MyThread is running..."); }}// 创建并启动线程MyThread myThread = new MyThread();myThread.start();
实现Runna ...
Java中的集合分类1. Collection 接口
List:有序、可重复,支持索引访问。
ArrayList:动态数组,随机访问快,增删慢(非线程安全)。
LinkedList:双向链表,增删快,随机访问慢。
Vector:线程安全的动态数组(性能较低,不推荐使用)。
Set:无序、唯一(元素不能重复)。
HashSet:基于哈希表实现,元素需重写 hashCode() 和 equals()。
LinkedHashSet:维护插入顺序的哈希表。
TreeSet:基于红黑树实现,元素需实现 Comparable 接口或提供 Comparator,保证元素有序。
Queue:队列(FIFO)或双端队列(Deque)。
LinkedList:实现了 Deque 接口,支持双向队列操作。
PriorityQueue:优先队列,基于堆结构,元素按自然顺序或自定义比较器排序。
ArrayDeque:动态数组实现的双端队列,性能优于 LinkedList。
2. Map 接口
HashMap:哈希表实现,键值对无序,允许 null 键和 null 值(非线程安全)。
L ...
一、问题本质“超卖”和“少买”是并发修改库存导致的数据不一致问题。
超卖:库存 1 件,却卖出 2 件(库存减到负数)
少买:库存足够,但有线程被锁或排队失败,导致明明能买却没买成功。
根因是:多个线程几乎同时读取相同库存值,然后同时修改,导致覆盖更新。 比如:
库存=1线程A查库存=1 → 下单 → 库存=0线程B查库存=1 → 下单 → 库存=-1(覆盖更新)
二、常见解决思路总览我们可以从三个层面看:
层面
核心手段
举例
数据库层面
行锁、悲观锁、乐观锁
for update、version 字段
缓存/队列层面
异步削峰、单线程顺序消费
Redis + MQ
分布式协调层面
分布式锁、防重令牌
Redis、Zookeeper
三、具体实现方案1. 悲观锁(数据库行锁)做法:
select stock from product where id = 1 for update;-- 判断库存>0update product set stock = stock - 1 where id = 1;
这种方式在 MySQL InnoD ...
🧩 一、业务背景在电商中,用户下单但未付款时,系统会给他一个支付有效期(比如 30 分钟)。 超过有效期还未支付的订单,需要自动关闭,释放库存、恢复优惠券等。
目标:用户下单 → 30 分钟未支付 → 系统自动关闭订单⚙️ 二、常见实现方案(按复杂度递进)✅ 方案一:定时任务轮询数据库(最简单)思路: 用 Spring Task 或 Quartz 定时任务,每隔几分钟扫描一次未支付且已超时的订单,批量修改为“已关闭”。
伪代码:
@Scheduled(cron = "0 */5 * * * ?") // 每5分钟执行一次public void closeTimeoutOrders() { List<Order> orders = orderMapper.findUnpaidOrdersOlderThan(30); for (Order order : orders) { orderService.closeOrder(order); }}
优点:
实现简单,易于理解。缺点:
不 ...
1.java 的运行机制Java的运行机制:先编译,后解释执行。
详细来讲:源文件经过编译器编译生成字节码文件,然后由解释器解释执行
2.输出语句两种写法的区别
System.out.println():输出内容默认换行,输出内容可以为空
System.out.print()输出内容不换行,输出内容不能为空
3.带包编译和不带包编译和运行的命令不带包:编译->javac 源文件名.java 执行->java 类名
带包:编译->javac -d . 源文件名.java 执行->java 包名.类名
4.公开类的使用特点public class 类名{}
公开类public,作用为保证不同包下的类可以相互访问
类名必须与源文件名字保持一致
一个源文件可以存在0-1个
5.包的位置与数量package 自定义包名1.包名2.包名3;
位置:包作用为对字节码文件进行整理分类,在有效代码的第一行
数量:一个源文件可以声明0-1包
6.java的特点
简单开源
跨平台(平台无关性):一次编写,到处运行
面向对象(封装,继承,多态)
自动内存 ...
Java教程Java 简介Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。
后来 Sun 公司被 Oracle (甲骨文)公司收购,Java 也随之成为 Oracle 公司的产品。
Java分为三个体系:
JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)
JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版)
JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。
2005 年 6 月,JavaOne 大会召开,SUN 公司公开 Java SE 6。此时,Java 的各种版本已经更名,以取消其中的数字 “2”:J2EE 更名为 Java EE,J2SE 更名为Java SE,J2ME 更名为 Java ME。
主要特性
Java 语言是简单 ...







