Java并发
文章平均质量分 80
JAVA并发编程
井九111
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
开发笔记:写操作统一架构模式
│ Task ID 法:伪 AT 模式,简单场景够用 ││ 分布式事务:框架支撑,能力更全但不代表一定强一致 ││ 一致性强弱、异常策略:都是你根据业务决定的 ││ ││ 大公司做法: ││ - 不是所有业务都走缓存+批量 ││ - 核心链路同步强事务 ││ - 非核心链路异步+最终一致 ││ - 分场景、分级别、按重要性选策略 ││ ││ 没有银弹,只有取舍 │。原创 2025-12-20 01:56:56 · 379 阅读 · 0 评论 -
Java 锁机制完整学习笔记
锁类型争抢目标存储位置对象头 Mark Word对象内存布局state 状态变量AQS 堆内存。原创 2025-12-19 02:08:08 · 1642 阅读 · 0 评论 -
JUC(java.util.concurrent)完整学习笔记
线程池 = 装线程的集合,管理、复用、调度ForkJoinPool = 分治思想 + 工作窃取CompletableFuture = 集大成者→ 封装底层同步器→ 链式调用→ 不用手动写 CountDownLatch、Semaphore 等。原创 2025-12-17 02:12:25 · 878 阅读 · 0 评论 -
Seata 分布式事务:AT 模式 vs XA 模式深度剖析
维度AT 模式XA 模式锁的位置应用层(Seata TC)数据库层连接占用时间短(本地提交即释放)长(prepare 到 commit)一致性级别最终一致强一致隔离性全局锁(Seata 层)数据库原生锁非 Seata 事务访问❌ 有脏写风险✅ 安全高并发性能✅ 好❌ 较差回滚机制undo log 补偿数据库原生回滚AT vs XA 的核心区别:不是 "有没有 undo log"而是 "连接和锁占多久"AT:用完连接立刻还,锁存在 TC(内存/Redis)→ 高并发友好。原创 2025-12-15 00:20:44 · 1161 阅读 · 0 评论 -
多线程事务
1. 虚拟线程的价值 ✅- Mount/Unmount机制- 故障隔离性强- 资源占用少2. XA vs AT的选择 ✅- 小任务量 → XA- 大并发 → AT- 不存在绝对的"谁更好"3. 通知延迟可忽略 ✅- 2-3ms(占比0.3%)- 虚拟线程更快- 同内存,无网络开销4. 资源浪费可接受 ✅- 连接池够用- 实际损失为0- "占用几个没关系"5. 锁占用影响小 ✅- 批量插入锁定新行- 其他事务访问概率低- 实际阻塞几乎为0。原创 2025-11-07 01:34:12 · 409 阅读 · 0 评论 -
签名机制笔记
签名不是万能的安全手段,而是一环。你要把它放在:✅ 签名 + 鉴权(身份)+ 权限控制 + 传输加密 + 风控追责这五层组合下看待,才能构建真正稳固的安全体系。原创 2025-06-27 00:14:30 · 715 阅读 · 0 评论 -
分布式系统一致性模型笔记
模型是否保证可读是否保证实时最新是否保证顺序适用场景强一致性✅ 一定✅ 一定✅ 一定金融交易、Zookeeper顺序一致性✅ 一定❌ 不一定✅ 一定多线程/多副本模型因果一致性✅ 一定❌ 不一定✅ 部分(有因果)社交平台会话一致性✅ 一定✅ 会话内❌移动应用单调读一致性✅ 一定❌ 不一定✅ 趋势新弱一致缓存最终一致性✅ 最终❌ 不一定❌DNS、Dynamo弱一致性❌ 不一定❌ 不一定❌缓存系统、CDN。原创 2025-06-09 14:03:05 · 622 阅读 · 0 评论 -
线程安全HashMap
哈希表底层是一个数组,每个数组槽(单元)里存储一个链表(或 JDK8 后链表+红黑树混合结构)。也就是说,数据是分布在数组的不同槽中,每个槽可能存一个链表。原创 2025-05-18 18:35:21 · 402 阅读 · 0 评论 -
HashMap
哈希算法将 key 通过hashCode()转成哈希值,作为“摘要”标识。使用扰动函数进一步均匀分布哈希值,避免哈希冲突聚集。计算数组索引时使用(n 为容量,2 的幂),提高效率。冲突不可避免,设计良好的hashCode()和equals()减少冲突概率。特性说明本质基于哈希算法的键值映射,通过数组快速定位数据底层数据结构JDK7:数组+链表;JDK8:数组+链表+红黑树哈希函数hashCode()+ 扰动函数,位运算快速定位索引冲突解决链表,链表长度≥8且容量≥64时转红黑树。原创 2025-05-18 17:24:13 · 731 阅读 · 0 评论 -
AQS的简介
是 JUC 包中用来构建锁和同步器的核心框架。它基于一个。原创 2025-05-14 19:02:08 · 772 阅读 · 0 评论 -
JVM的内存结构的两个角度:JVM虚拟机层和线程。
│ 主内存 │ ← 所有共享变量↑ ↑工作内存 工作内存(线程A) (线程B)↑ ↑执行代码 执行代码。原创 2025-05-14 18:11:45 · 844 阅读 · 0 评论 -
锁的优化笔记
机制场景优点注意事项或缺点偏向锁无竞争,单线程反复访问取消加锁过程多线程竞争会退化为轻量级锁轻量级锁多线程访问但冲突较少快速获取锁,避免上下文切换冲突严重时仍会膨胀为重量级锁自旋锁临界区执行非常快避免线程阻塞/唤醒等待时间长会浪费CPU适应性自旋锁自旋锁优化升级更智能,提升资源利用率JVM 维护开销略大分段锁多线程访问共享集合结构并行访问提升实现复杂,需合理分段乐观锁多读少写读快无锁,提高吞吐写冲突时需要回滚或重试锁粗化连续多次加锁解锁。原创 2025-05-14 15:02:46 · 480 阅读 · 0 评论 -
wait必须放在 synchronized 同步块中?为啥 wait() 在 Object 类里,sleep() 在 Thread 里?
对比点wait()sleep()定义位置Object类Thread类是否释放锁✅ 会释放锁❌ 不释放锁是否需要同步块✅ 必须在中调用❌ 可以在任何地方调用作用线程间通信,进入等待队列等待唤醒当前线程休息一会儿唤醒机制需要其他线程调用notify()时间到了自动醒来wait()是多人协作排队,必须“拉个队伍+发通知”,所以要锁;sleep()是“我先眯一会儿”,不管别人,也不让出门钥匙,自然不用锁。原创 2025-05-14 14:55:02 · 465 阅读 · 0 评论 -
死锁,活锁,饥饿的区别
特性死锁活锁饥饿是否运行❌(阻塞)✅(在执行)❌(几乎不执行)是否推进❌❌❌是否冲突✅(互相等待)✅(互相让步)❌本质原因资源循环等待逻辑策略冲突调度优先级问题常见场景多线程加锁自旋/重试逻辑优先级调度不当。原创 2025-05-14 14:37:19 · 612 阅读 · 0 评论 -
JAVA的线程调度算法
当有高优先级线程就绪时,系统可以中断当前正在运行的低优先级线程,将 CPU 分配给高优先级线程。Java 的线程调度模型就是抢占式的,但它的实现是依赖于底层操作系统调度器的支持。特性Java 说明调度模型抢占式(Preemptive)是否保证优先级高就一定先执行?否,优先级只是“建议”,实际调度由 OS 决定是否可以直接控制抢占行为?不行,不能强制中断线程,只能配合yield()sleep()join()等手段影响调度。原创 2025-05-14 14:30:31 · 435 阅读 · 0 评论 -
线程的几种状态以及调用两次 start 方法会怎么样
在 Java 中,线程的生命周期包括多个状态,不同状态之间的转换由线程的生命周期控制方法(如start()sleep()wait()等)和线程调度器共同决定。原创 2025-05-14 14:16:33 · 472 阅读 · 0 评论 -
Fork/Join框架简介
是 Java 7 引入的并发框架,基于的思想,适用于将并行处理,最后将结果合并。原创 2025-05-14 10:19:07 · 282 阅读 · 0 评论 -
伪共享的简介
伪共享是指。原创 2025-05-13 10:59:24 · 970 阅读 · 0 评论 -
CAS和ABA问题
CAS 在比较当前值和期望值时,只能判断值是否相等,而无法判断值在期间是否被其他线程改过然后又改回来。ABA 本质问题:CAS 看不出值“曾经变过”根本解决方法:加入版本号或标志位,感知中间变化实践推荐:使用或,在高并发场景(如锁、队列)中避免 ABA 问题。原创 2025-05-13 10:35:20 · 596 阅读 · 0 评论 -
volatile的可见性与指令重排序
是 Java 中的一个关键字,用于修饰变量。它的作用主要是确保多线程环境下对变量的修改能够及时反映到主内存,避免线程间由于本地缓存带来的数据不一致性。在多线程环境中,每个线程都有自己的工作内存(如 CPU 缓存)。线程对变量的修改首先在其工作内存中进行,不会立即写回主内存。其他线程可能无法及时看到这些修改,导致可见性问题。 保证可见性:当一个变量被声明为 时,JVM 确保对该变量的每次写操作都直接刷新到主内存,并且其他线程对该变量的读取总是从主内存中获取最新值,而不是从线程本地缓存中读取。应用场景:当多个原创 2025-05-12 17:54:06 · 866 阅读 · 0 评论 -
可重入锁,公平锁,非公平锁
可重入锁:允许同一个线程多次获得锁,不会发生死锁。常用于递归调用等场景。公平锁:严格按照请求锁的顺序来分配锁,避免线程饥饿。适用于需要严格顺序的场景,但性能开销较大。非公平锁:允许线程“插队”,减少锁的等待时间,提高吞吐量,但可能会导致线程饥饿,适用于性能要求较高的场景。原创 2025-05-12 18:04:16 · 432 阅读 · 0 评论 -
ReenTrantLock和Synchronized锁
当一个线程第一次请求锁时,JVM 会记录该线程的 ID,并将锁标记为偏向锁。此后,若同一线程再次访问该锁,JVM 会直接认为该线程已经持有锁,从而避免加锁和解锁操作,提升性能。线程第一次请求锁时,JVM 将锁对象标记为偏向锁,并记录线程 ID。当相同线程再次访问该锁时,JVM 检查对象头中的线程 ID,若匹配,线程直接获取锁,无需再次加锁。如果其他线程争用锁,偏向锁会被撤销,锁将进入轻量级锁或重量级锁状态。:适用于没有竞争的单线程场景,可以显著提升性能。:轻量级锁通常是偏向锁升级后的结果。原创 2025-05-12 18:28:23 · 633 阅读 · 0 评论 -
CompletableFuture类的简介
用于在 I/O 操作完成时回调通知,它通常更适合用于异步 I/O(例如文件 I/O、网络 I/O),因为它不涉及任务的组合或链式调用,仅仅是任务完成后的回调。它提供了大量的异步任务控制方法,并且支持链式调用、组合任务、异常处理等功能,使得异步编程更加简洁和可读。主要是处理计算任务的异步结果,而 AIO 的 I/O 操作本身就是基于回调模式,因此不太适合使用。提供了丰富的 API 来控制异步任务的执行顺序、结果组合和异常处理,适合异步计算的编排。,因为它专门用于异步 I/O 操作,回调方式更合适。原创 2025-05-10 18:31:09 · 899 阅读 · 0 评论 -
多线程的三个工具类
方法减少计数器值,直到计数器值为 0 时,所有等待的线程才会被唤醒,继续执行。是一个同步屏障,它允许多个线程相互等待,直到所有线程都到达一个共同的屏障点。它的计数器表示到达屏障的线程数量,直到所有线程都到达屏障点,才会继续执行。:可以用在并行计算中,所有线程需要同时开始执行某个步骤,执行完后继续。:多个线程并行执行一些操作,待所有线程执行完成后,统一进行后续操作。方法,直到所有线程都到达屏障,屏障会被打开,所有线程才继续执行。,可以在任何时刻控制并发线程的数量,确保线程数不超过允许的数量。原创 2025-05-10 15:30:55 · 576 阅读 · 0 评论 -
同步异步,阻塞非阻塞,以及BIO,NIO,AIO网络编程模型的演变过程。
你说得对,BIO模型的缺点并非因为线程池资源耗尽,而是因为每个连接都会创建一个线程,这在高并发时会导致大量线程的创建和资源浪费,线程池是在这个问题被发现后用来优化的。这样,应用程序不再需要等待,也不需要轮询状态。随着并发请求数的增多,系统会快速消耗大量的线程资源,这会导致严重的性能瓶颈。:为了避免每个连接创建一个线程的问题,线程池的引入可以让线程复用,这样系统不会为每个请求都创建新的线程。:由于线程的阻塞性质,在I/O操作完成之前,线程不能处理其他任务,因此BIO模型在高并发、大规模连接场景下的效率低下。原创 2025-05-10 16:43:52 · 878 阅读 · 0 评论 -
ThreadLocal 和 ThreadLocalMap以及ThreadLocalMap内存泄漏的问题
等来处理父子线程之间的值传递。(建议value直接用map省的麻烦了)会随着线程的生命周期管理值的存储,在不再使用时,会清理掉不再需要的。对象只能存储一个值。如果需要存储多个不同的值,通常需要多个。是用于为每个线程提供独立的变量副本的类,每个线程访问。是由线程自动维护的,不需要外部手动创建。是线程私有的,不能直接由外部创建和访问。这样可以保证每个线程使用的是自己的值。是一个线程级别的存储结构,存储了。时,都能得到自己专属的值。每个线程会有一个与之关联的。来存储不同线程的数据。对应的每个线程的值。原创 2025-05-09 15:04:51 · 386 阅读 · 0 评论 -
线程池的提交过程和状态以及参数设计
对于这个问题首先得明白线程池的参数。原创 2025-05-10 18:41:39 · 303 阅读 · 0 评论 -
控制线程执行顺序的方案
我们可以精确控制线程的执行顺序。来控制线程顺序,我们可以让 t1 执行完成后减少计数器,并让 t2 等待计数器为零后再执行。是 Java 提供的一个线程同步工具,它允许一个线程等待多个线程执行完毕后再继续执行。:适用于等待多个线程完成后再继续执行的场景,或者当有多个线程需要同步时。:适用于复杂的线程控制,尤其是需要精确控制线程暂停和唤醒时的场景。:适用于简单的线程执行顺序控制,线程间的依赖关系较少时使用。方法,当前线程会等待被调用的线程执行完毕后再继续执行。可以控制多个线程的顺序,适用于多个线程的同步。原创 2025-05-10 17:29:14 · 445 阅读 · 0 评论 -
停止线程的多种方案
是一种强制停止线程的方法,但是它已经被弃用,不推荐使用。该方法会立即终止线程的执行,这可能导致一些资源未释放或数据不一致,从而引发内存泄露或其它潜在问题。在 Java 中,停止线程的方式有很多种,但每种方法都有其适用的场景和潜在的风险。通过中断线程,线程可以收到中断信号,并根据具体的实现来决定是否停止。强制停止线程,线程在被停止时可能会正在执行临界区代码或持有锁,可能会导致数据不一致、内存泄露、死锁等问题。:适用于简单的线程控制,且线程不需要频繁阻塞的场景。:不推荐使用,已经废弃,避免在项目中使用。原创 2025-05-10 17:28:03 · 845 阅读 · 0 评论 -
线程之间的数据传输
/ 等待子线程执行完毕。// 子线程访问父线程的 context 值。// 创建一个 InheritableThreadLocal 变量。// 子线程修改自己的 context 值。// 子线程修改后的 context 值。// 主线程继续使用自己的 context 值。// 父线程设置 context 的值。// 打印父线程的 context 值。// 打印父线程的 context 值。在创建子线程时会将父线程的值复制过去。// 启动一个子线程。原创 2025-05-09 14:50:45 · 1222 阅读 · 1 评论
分享