java的并发
问题:
过程:
正常流程:记录生成:状态=1--》北京:状态 = 3,4,--》定时任务:状态=5---》结束
异常流程:一条待处理的的记录生成以后,马上被定时任务处理,加载到内存,状态=1,定时任务比较慢,2min处理一次,在这过程中,北京那边修改了状态=3,4,这时候定时任务处理完了,修改状态=1,状态被复原了。
修复:并发引起问题:可以加锁,故在定时任务修改数据库判断状态=1,不处理
总结:
我们的程序要运行,离不开CPU、内存、IO设备,但是他们三者之间的执行速度是有差异的。
CPU 的执行速度最快,内存的速度次之,IO设备的速度最慢。
为什么会有内存缓存
CPU 执行一条指令非常快,但是他从内存中读取某个数据时,就需要等待很长的时间,为了弥补速度上的巨大差异,让 CPU 不被内存拖垮,所以在 CPU 上增加了缓存。
当 CPU 请求内存中的数据时,会先查看缓存中是否有该数据,如果存在则直接返回该数据;如果不存在,则要先把内存中的数据载入缓存,然后再返回给 CPU。
所以我们的程序在执行时,往往就需要将数据从内存中读取出来载入到缓存中,然后进行处理,处理完成之后再将数据回写到内存中去。
除此以外,现代的计算机都是多CPU、多核的,程序也不再只运行在单一线程中,而是有多个线程在运行。
每个线程都会维护一份自己的内存副本,也就是 CPU 缓存,所以线程之间一定会存在数据一致性的问题。
一般来说,导致并发问题的根源不外乎以下这几个原因:
可见性:一个线程对共享变量的修改,另一个线程是否可见?
原子性:一个或多个操作在 CPU 执行的过程中是否会被中断?
有序性:程序编译后的指令是否会按照代码原本的顺序执行?
遗憾的是,以上三个问题的答案都是不确定的,正因为这些不确定所以才会存在并发下的各种问题。
线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有一下两点:
- 存在共享数据 (也称临界资源)
- 存在多条线程共同操作共享数据
只用同时满足上面两个条件,才会引发线程安全问题。
最新文章
- Windows编译Nginx源码
- Mina入门实例(一)
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
- python--数据清洗
- Struts1与Struts2的12点区别
- Innosetup中将bat文件压缩到压缩包中
- yoeman构建Asp.net core项目并且实现分层
- dd命令
- TCP/IP具体解释--UDP数据报中的IP分片
- java中volatile
- 利用拷贝data目录文件的方式迁移mysql数据库
- 判断当前设备是移动端或者PC端
- EF CodeFirst类生成器
- Idea突然不停indexing的问题
- 1_2_3_4_5 Html-Css
- python 模块之-configparser
- Codeforces 238 div2 A. Gravity Flip
- 洛谷 P2022 有趣的数 解题报告
- 使用http维持socket长连接