上一页 1 2 3 4 5 6 7 8 ··· 17 下一页
摘要: 多线程的思想是不让CPU空跑。JVM的特点之一是堆可共享——>安全问题,CPU,L1,L2,L3闪电缓存——>不一致。 所以并发编程中需要注意的问题: 安全性问题、活跃性问题和性能问题。 安全性问题指:可见性,原子性,有序性 其实只有一种情况需要:存在共享数据并且该数据会发生变化,通俗地讲就是有多个 阅读全文
posted @ 2020-12-28 15:19 smartcat994 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 死锁的一种解决方式可以通过循环来对资源进行重复请求做到。循环的作用就是为了获取资源。 // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply(this, target)) ; 如果 apply() 操作耗时非常短,而且并发冲突量也不大时,这个方案还挺不错的,因为这种场景下, 阅读全文
posted @ 2020-12-28 10:21 smartcat994 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 死锁的产生可以认为是锁的颗粒度太小造成的,如果把化妆这个情况整体加锁是不会有死锁的。但是如果把化妆里面的镜子和化妆品拆分加锁,就可能出现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 阅读(185) 评论(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 阅读(59) 评论(0) 推荐(0) 编辑
摘要: 串行思维是一个很固化的东西,不过也很尴尬的是,处理器最早最早的时候就是串行。你说串行思想肯定是与生俱来的,特别是写代码的时候。能稍微用来一点分治的思维,代码就已经相当的有可读性了。但是多线程这东西肯定是要深刻留在大脑里面的,不然注定面试时候被敲倒。这年头其实说实话,我写代码以来就感觉这个水平是真的参 阅读全文
posted @ 2020-12-25 09:19 smartcat994 阅读(184) 评论(0) 推荐(0) 编辑
摘要: Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能 。 一个redis集群一般由多个节点构成,节点和节点之间的关联通过CLUSTER MEET指令进行实现。 初始化三个redis节点 查看三个节点的对外地址 执行「docker inspect re 阅读全文
posted @ 2020-12-23 14:00 smartcat994 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 就是Redis中的哨兵,哨兵这种思想是真的很伟大,我是很喜欢这玩意的。目前在java的开发中,一个分治,哨兵,桥接。这三个我是使用最多也是最经常使用的手段。 一个有意思的想法就是,redis主服务器可不可以是其他服务器的子服务器。当然是可以的。链式结构的思想实现。 Sentinel系统的主要作用就是 阅读全文
posted @ 2020-12-22 15:04 smartcat994 阅读(76) 评论(0) 推荐(0) 编辑
摘要: 在Redis中,用户可以通过SLAVEOF命令或者slaveof选项让一个redis服务器去复制另外一个服务器的数据,这个复制是所有的库。 在执行SLAVEOF的时候,从服务器会向主服务器发送一个SYNC命令,主服务器收到SYNC命令之后会进行BGSAVE命令(也就是生一个子进程进行RDB操作),然 阅读全文
posted @ 2020-12-22 10:57 smartcat994 阅读(105) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 17 下一页