- 博客(29)
- 收藏
- 关注
原创 【synchronized 与 ReentrantLock + Condition 的深度对比 Plus版】
最近和很多读者深入交流了Java多线程中两个核心的等待/通知机制:synchronized + wait/notify 和 ReentrantLock + Condition。很多同学在学习时都会疑惑:为什么Condition更高级?为什么高并发容器都用Condition?为什么synchronized容易出现“惊群效应”?今天我们把这些问题全部串起来,用最通俗易懂的语言,从底层实现讲起,一步步把Monitor的两个队列、线程状态流转、惊群效应、Condition的精确唤醒全部讲清楚。
2025-12-18 17:15:44
657
原创 Java多线程等待唤醒机制:从synchronized到Lock+Condition
今天来聊聊Java多线程里一个超级经典的话题——等待唤醒机制。在多线程编程里,我们经常遇到“线程协作”的场景:比如一个线程生产数据,另一个线程消费数据;或者两个线程需要严格交替执行(像乒乓球一样你一下我一下)。这时候就需要“等待唤醒”:条件不满足时线程自己睡一觉,等条件好了再被叫醒继续干活。今天重点讲,因为它更灵活、更高效,是现代并发编程的主流(Java并发包里的阻塞队列都是用这个实现的)。我们会用一个简单例子——两个线程交替打印0~9——来一步步讲解。
2025-12-17 08:34:39
665
原创 【阻塞队列的等待唤醒机制】
阻塞队列(BlockingQueue)的等待唤醒机制。在多线程编程中,生产者-消费者模式是最常见的场景之一。而阻塞队列正是解决这个模式的核心工具。它能在队列满时阻塞生产者、在队列空时阻塞消费者,从而实现线程间安全高效的协作。阻塞队列的基本概念和作用Java并发包中阻塞队列的实现原理(以ArrayBlockingQueue为例)等待唤醒机制的核心:wait()、notify() 与 Lock + Condition手把手自定义一个简单阻塞队列常见面试题延伸Java// 消费指针。
2025-12-15 18:46:59
940
原创 【Java多线程同步指南:方法、方法块与锁对象】
今天我们来聊聊多线程编程里的“守护神”——synchronized。它能帮我们避免线程“打架”导致的数据乱象,但怎么用才高效?我们重点说说同步方法、同步方法块,以及锁对象选this还是object的门道。这篇是之前两篇内容的精华总结:先看同步方法和方法块的相同点不同点,再聊锁对象的选择。代码会保持简单,解释通俗,像聊天一样。适合多线程小白上手。如果你正纠结“怎么锁才对”,读完这篇准能get到精髓。锁类型 场景 优缺点this 实例变量,简单方法 易用,但可能外泄。
2025-12-15 18:34:38
955
原创 【Java多线程同步全攻略:从同步方法到锁对象的“三剑客”】
大家好,我是[你的昵称],一个沉迷Java多线程的码农。今天这篇是系列的“终极总结”——基于之前聊的同步方法、同步方法块,以及锁对象的this、非static Object、static Object这些“老铁”。我们从头捋一遍:怎么用?相同不同?选哪个锁?全用白话+简单代码说清,适合新手速成。如果你正为“线程安全怎么锁”挠头,这篇准能帮你拨云见日。多线程像“多人抢饭”,不锁资源就乱套。synchronized是Java的“门卫”,但锁对了是守护神,锁错了是性能杀手。咱们一步步来。
2025-12-08 10:33:08
504
原创 【Java try-catch、throw 和异常处理的深度指南:从基础到实战】
今天咱们继续聊异常处理,这次来个更详细的版本。上次简单过一遍try-catch和throw,这次我加深点:从异常的“家谱”说起,到自定义异常、异常传播,再到实战中的最佳实践。异常处理不是负担,而是让代码更robust(健壮)的秘诀。Java的checked异常设计虽严谨,但用对地方,能省不少debug时间。如果你是中级开发者,或者想写出企业级代码,这里我用更多例子、图解思路,一步步拆解。代码还是保持简单(JDK 8+兼容),直接复制跑。咱们不急,平和地学——异常像生活,总有不测,但提前准备就好。
2025-12-06 15:52:39
581
原创 【Java中String、StringBuffer和StringBuilder的区别与使用】
本文章详细讲解了string stringbuilder stringbuffer 的区别和使用
2025-12-04 11:27:55
546
原创 Java IO流详解:从入门到实践,让你轻松搞懂文件读写
本文章详细讲解了Java OI流的细节,处理方式,用简单易懂的代码和平易近人的语气撰写文章
2025-12-03 18:47:27
653
原创 spfa和bellman-ford和floyd算法的区别与适用场景
本文详细讲解了bellman-ford算法 floyd算法 dijkstra算法的核心思想 适用场景。配合样例将思路 算法模板呈现出来。
2025-05-17 10:41:41
969
原创 C++双指针快排算法
时间复杂度通常较低,很多情况下能达到线性时间复杂度O(n),避免了暴力解法中可能出现的双重循环导致的O(n^2)时间复杂度,提高了算法效率。
2025-04-10 16:50:44
1851
原创 二维vector数组
获取行数和列数:可以使用 vec.size() 获取二维 vector 的行数,使用 vec[0].size() 获取二维 vector 的列数。- 直接初始化: vector<vector<int>> vec = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};,这样就创建了一个3行3列的二维 vector ,并初始化了其中的元素。- 可以使用 vec[i][j] 的方式来访问二维 vector 中的元素,其中 i 表示行索引, j 表示列索引。
2025-03-06 23:05:55
596
原创 unordered_map和pair
在实际应用中,比如在文本处理时,要统计每个单词出现的次数,就可以使用 unordered_map ,将单词作为键( key ),出现的次数作为值( value )。- 因为是基于哈希表存储, unordered_map 并不保证元素的存储顺序,也就是说,当你遍历 unordered_map 时,元素的顺序可能和你插入时的顺序不同。- 强调数据结构: pair 作为一种数据结构,将相关的两个数据组合在一起,使用它插入 unordered_map 能强调数据的二元组性质,使代码更符合数据结构的语义。
2025-03-06 22:50:19
1044
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅