并发编程
文章平均质量分 94
手插口袋谁也不爱♡
努力学编程
展开
-
学习ReentrantLock 原理
可重入是指同一个线程如果首次获得了这把锁,那么它是这把锁的拥有者,因此有权利再次获取这把锁,如果不可重入锁,那么第二次获得锁时,自己也会被锁挡住,直接造成死锁。从后向前的唤醒的原因:enq 方法中,节点是尾插法,首先赋值的是尾节点的前驱节点,此时前驱节点的 next 并没有指向尾节点,从前遍历会丢失尾节点。当前队列不为 null,并且 head 的 waitStatus = -1,进入 unparkSuccessor。如果锁被另一个线程保持,则当前线程被禁用线程调度,并且在锁定已被获取之前处于休眠状态。原创 2024-03-24 17:22:49 · 822 阅读 · 3 评论 -
JUC-线程池
ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量。这些信息存储在原子变量ctl中,将线程状态与线程数合二为一,这样就可以用一次cas操作进行赋值。原创 2024-03-14 19:18:55 · 1378 阅读 · 2 评论 -
深入解析哈希表、哈希映射和并发哈希映射的区别,以及死锁的成因和解决方案
可以举例“哲学家就餐问题”,有一群哲学家围着一张桌子吃饭,每两个哲学家之间放一个筷子,哲学家只做两件事:思考人生 或者 吃面条。思考人生的时候就会放下筷子。吃面条就会拿起左右两边的筷子(先拿起左边, 再拿起右边),哲学家发现筷子拿不起来就会阻塞等待思考人生。五个哲学家同一时刻同时拿起左的筷子,再去拿右边的筷子就会发现筷子已被占有,就会阻塞等待,进行思考人生,哲学家们互相挂起等待就会形成“死锁”。死锁是多线程编程中常见的问题,当两个或多个线程互相等待对方持有的资源而无法继续执行时,就会发生死锁。原创 2023-09-24 15:36:50 · 294 阅读 · 11 评论 -
Java中synchronized:特性、使用、锁机制与策略简析
当一个线程进入synchronized代码块时,它会尝试获取指定对象的内置锁,只有当线程释放锁之后,其他线程才能获得锁并执行同步代码。按照之前对锁的理解就是,锁没有释放,进行再次加锁就会进行阻塞,直到第一次的锁被释放,才能获取到第二个锁,但释放第一个锁也由该线程来进行,结果现在这个线程啥都干不了,也就只能形成死锁了。按照之前对锁的理解就是,锁没有释放,进行再次加锁就会进行阻塞,直到第一次的锁被释放,才能获取到第二个锁,但释放第一个锁也由该线程来进行,结果现在这个线程啥都干不了,也就只能形成死锁了。原创 2023-09-20 22:33:38 · 325 阅读 · 5 评论 -
解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略
CAS: 全称Compare and swap,字面意思:”比较并交换“,CAS涉及如下操作:假设内存中的原数据为A,旧的预期值为B ,需要修改的值为C。首先把A与B进行比较,看A与B是否相同。如果A与B相同,则把数据C的值赋予A。返回操作成功。我们来写一个CAS的伪代码以帮忙我们更好理解CAS。//进行比较看a是否发生变化if(a==b){a=c;CAS是乐观锁的一种实现方式,当多个线程对一个数据进行操作时,只有一个线程操作成功,其他线程并不会阻塞,会返回操作失败的信号。原创 2023-09-20 17:52:16 · 271 阅读 · 1 评论 -
深入理解Java单例模式和优化多线程任务处理
单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例,并提供一个全局访问点。单例模式确保类的唯一实例,并提供了全局访问点,以便全局共享该实例。阻塞队列提供了一种线程安全的协作机制,用于在线程间传递和同步数据,实现高效的任务处理。通过理解和正确应用单例模式和阻塞队列,可以提高多线程编程的效率、可靠性和安全性。原创 2023-09-18 21:13:01 · 580 阅读 · 3 评论 -
探索多线程编程:线程的本质、状态和属性
线程是现代计算机编程中至关重要的概念之一。它使得我们能够更高效地利用多核处理器,提高程序性能并实现多任务并发操作。本文将深入探讨线程的本质、不同状态以及可配置的属性,帮助读者更清晰地理解并应用线程。原创 2023-09-06 23:50:46 · 483 阅读 · 37 评论