
并发编程基础篇
文章平均质量分 94
pngyul
我的生活不只有coding,还有看不懂的诗和去不了的远方。
展开
-
Java 为什么再造管程(六)
文章导读:并发编程理论篇(一)可见性,原子性,有序性的源头(二)Java 如何解决可见性、有序性和原子性问题(三)为什么存在等待 - 通知机制(四)宏观角度看并发(五)管程:并发编程的万能钥匙在前面,我通过白话文的方式,简单介绍了并发编程的理论篇,感兴趣的可以看看前面的文章。接下来,简单聊聊并发编程工具篇。Java 为什么再造管程我们都知道,Java 语言本身提供的 synchronized 是管程的一种实现。另外,Java SDK 并发包通过 Lock 和 Condition 两个接口.原创 2021-12-06 22:36:27 · 298 阅读 · 0 评论 -
为什么存在等待 - 通知机制(三)
细粒度锁的代价上一章说到,用不同的锁对受保护资源进行精细化管理,使用细粒度锁可以提高并行度,是性能优化的一个重要手段。然而,天底下没有免费的午餐。使用细粒度锁是有代价的,这个代价就是可能会导致死锁。// 经典的一个转账例子 ,会导致死锁class Account { private int balance; // 转账 void transfer(Account target, int amt){ // 锁定转出账户 synchronized(this) {原创 2021-11-17 22:46:25 · 755 阅读 · 1 评论 -
Java 如何解决可见性、有序性和原子性问题(二)
在上一篇文章中,你可能已经知道了,导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了。合理的方案应该是按需禁用缓存以及编译优化。那么,如何做到“按需禁用”呢?对于并发程序,何时禁用缓存以及编译优化只有程序员知道,那所谓“按需禁用”其实就是指按照程序员的要求来禁用。所以,为了解决可见性和有序性问题,只需要提供给程序员按需禁用缓存和编译优化的方法即可。Java 内存模型是个很复杂的规范,可以从不同的视角原创 2021-11-16 23:39:35 · 659 阅读 · 0 评论 -
可见性,原子性,有序性的源头(一)
最近在学习极客时间的《并发编程实战》。我秉承着学习不仅是一个输入过程,输出也同等重要!下面大部分内容都是我在极客时间的笔记,但也有我的一些总结和见解。并发程序幕后的故事这些年,CPU、内存、I/O 设备都在不断迭代,不断朝着更快的方向努力。但是,在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异。CPU 和内存的速度差异可以形象地描述为:CPU 是天上一天,内存是地上一年(假设 CPU 执行一条普通指令需要一天,那么 CPU 读写内存得等待一年的时间)。内存和 I/O 设备的速度差异就原创 2021-11-15 23:52:18 · 663 阅读 · 0 评论