摘要: 死锁的产生可以认为是锁的颗粒度太小造成的,如果把化妆这个情况整体加锁是不会有死锁的。但是如果把化妆里面的镜子和化妆品拆分加锁,就可能出现A拿着镜子,B拿着化妆品。两个人互相卡着动不了,直到一方放弃当前,才可以进行进行。 死锁的一个比较专业的定义是:一组互相竞争资源的线程因互相等待,导致“永久”阻塞的 阅读全文
posted @ 2020-12-25 16:15 smartcat994 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 上一个文章已经介绍出了线程切换导致无法实现原子性。那么一个问题:单核CPU是否有原子性问题,是依然有安全性问题的。 public class OneCpuCoreTest implements Runnable { private static int count; @Override public 阅读全文
posted @ 2020-12-25 14:39 smartcat994 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 如果说造成线程不安全的情况是来源有时序性(代码优化),可见性(缓存一致性),原子性(线程切换)。 那么最简单的优化方式就是禁用缓存和编译优化。这样可以直接解决问题,就是代码的性能会相对的下降。合理的方案应该是按需禁用缓存以及编译优化。 这样的话就可以分治不同的代码,有并发的代码进行调整,没有并发的代 阅读全文
posted @ 2020-12-25 11:24 smartcat994 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 并发编程BUG的源头,如果深耕一点的话就是硬件上带来的差异性,CPU,内存,I/O之间的速度存在着差异。CPU:内存:I/O=100000:1000:1。由于CPU的执行太纯粹导致过快,而I/O实在不够纯粹。根据水桶效应其实可以很明显的感觉出整体的数据是取决最短的那块木板。 目前针对这些速度差,有了 阅读全文
posted @ 2020-12-25 10:36 smartcat994 阅读(61) 评论(0) 推荐(0) 编辑
摘要: 串行思维是一个很固化的东西,不过也很尴尬的是,处理器最早最早的时候就是串行。你说串行思想肯定是与生俱来的,特别是写代码的时候。能稍微用来一点分治的思维,代码就已经相当的有可读性了。但是多线程这东西肯定是要深刻留在大脑里面的,不然注定面试时候被敲倒。这年头其实说实话,我写代码以来就感觉这个水平是真的参 阅读全文
posted @ 2020-12-25 09:19 smartcat994 阅读(186) 评论(0) 推荐(0) 编辑