【Java并发入门】01 并发编程Bug的源头

一、根本原因
「CPU、内存、磁盘之间的速度差异」
- 为了能同时执行多个任务,CPU 发展出时间片轮转、多核等
- CPU 要从内存中读数据太慢了,所以给自己设置了缓存
- CPU 读磁盘更慢了,所以可以让该线程阻塞
二、直接原因
缓存导致的可见性问题
CPU 把要处理的数据加载到自己的缓存中,处理完了放回自己的缓存。
另一个 CPU 同样的处理,就导致可能看不到上一个 CPU 处理的结果。
线程切换带来的原子性问题
程序中的一行代码往往不是一条 CPU 指令。
线程切换的时候,可能会在一个代码执行的中间地方切换。
编译优化带来的有序性问题
优化会为了更高效的利用 CPU 缓存,将代码指令重排。
这个重排的过程会导致看似没问题的代码,多线程出现逻辑问题。
三、为啥要遇到这些问题
- 为了提高程序的性能
- 引入了新方法,就要处理这个方法对应的问题
- 可以说是硬件工程师和操作系统工程师为了提高执行效率,给软件工程师带来的麻烦
接下来的几篇文章会介绍如何解决上面提到的「可见性、原子性、有序性」的问题。
【Java并发入门】01 并发编程Bug的源头的更多相关文章
- 【转】可见性、原子性和有序性问题:并发编程Bug的源头
如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里.换句话说,这块知识点其实对于程序员来说,是比较进阶的知识.我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及 ...
- 01 | 可见性、原子性和有序性问题:并发编程Bug的源头
由于CPU.内存.I/O 设备的速度差异,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系机构.操作系统.编译程序都做出以下处理: 1. CPU 增加了缓存,以均衡与内存的速度差异: ...
- Java并发编程实战 01并发编程的Bug源头
摘要 编写正确的并发程序对我来说是一件极其困难的事情,由于知识不足,只知道synchronized这个修饰符进行同步. 本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章 ...
- 并发编程Bug起源:可见性、有序性和原子性问题
以前古老的DOS操作系统,是单进行的系统.系统每次只能做一件事情,完成了一个任务才能继续下一个任务.每次只能做一件事情,比如在听歌的时候不能打开网页.所有的任务操作都按照串行的方式依次执行. 这类服务 ...
- 【Java并发基础】并发编程bug源头:可见性、原子性和有序性
前言 CPU .内存.I/O设备之间的速度差距十分大,为了提高CPU的利用率并且平衡它们的速度差异.计算机体系结构.操作系统和编译程序都做出了改进: CPU增加了缓存,用于平衡和内存之间的速度差异. ...
- 从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例
引入高速缓存概念 在计算机在执行程序时,以指令为单位来执行,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入. 由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这 ...
- Java:并发笔记-01
Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 ...
- 《java学习二》并发编程
多线程创建方式 1.继承thread类,重写run方法 CreateThread createThread = new CreateThread(); ------createThread ...
- Java并发入门之FutureTask
Java并发入门之FutureTask 前言: 最近遇到一个项目需要上传图片到服务器,API要求是二进制流,那就跑慢点一点点上传. 于是对多线程从没有应用过的我,决定拿多线程直接应用于代码. 应用Ex ...
- Java 面试宝典!并发编程 71 道题及答案全送上!
金九银十跳槽季已经开始,作为 Java 开发者你开始刷面试题了吗?别急,我整理了71道并发相关的面试题,看这一文就够了! 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程( ...
随机推荐
- jdk(jvm)调式工具
JConsole 可视化工具介绍一. JConsole介绍1.1 JConsole描述Jconsole (Java Monitoring and Management Console),一种基于JMX ...
- 十五、跨主机通信overlay网络
系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...
- 【转载】内存基本概念-伙伴(Buddy)算法
简介 在Linux系统中,内存的分配与回收速率直接影响系统的存取效率.当内核频繁请求和释放不同大小的一组连续页框时,会导致许多外部空闲碎片,造成空间的浪费.使用伙伴算法可以有效地缓解该问题.伙伴关 ...
- 【调试】kprobes(一)基本概念
简介 开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用.何时被调用.执行是否正确以及函数的入参和返回值是什么等等. 比较简单的做法是在内核代码对应的函数中添加日志打印信息, ...
- rem布局,使用手机端,pc大屏——亲测好用
1 var docEl = document.documentElement, 2 //当设备的方向变化(设备横向持或纵向持)此事件被触发.绑定此事件时, 3 //注意现在当浏览器不支持orienta ...
- 简易机器学习笔记(九)LeNet实例 - 在眼疾识别数据集iChallenge-PM上的应用
前言 上一节大概讲了一下LeNet的内容,这一章就直接来用,实际上用一下LeNet来进行训练和分类试试. 调用的数据集: https://aistudio.baidu.com/datasetdetai ...
- Chrome/Edge 设置黑色主题
Chrome chrome://flags/#enable-force-dark Edge edge://flags/#enable-force-dark
- [转帖]Oracle进程中的 LOCAL=NO 和 LOCAL=YES
https://www.cnblogs.com/wjoyxt/p/3780860.html 我们在服务器上用sqlplus 连接数据库,在查看进程,会多出一条记录: oracle 16007 1600 ...
- [转帖]Windows设置WiFi走外网,有线网卡走内网。
https://www.itblogcn.com/article/1844.html 文章目录 设置笔记本 WIFI 走外网,网线走内网: 1.查看路由表: 2.删除默认路由: 3.添加 WiFi ...
- 【转帖】JAVA GC日志分析
https://zhuanlan.zhihu.com/p/613592552 目录 1. GC分类 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Par ...