java的并发

问题:

过程:

正常流程:记录生成:状态=1--》北京:状态 = 3,4,--》定时任务:状态=5---》结束

异常流程:一条待处理的的记录生成以后,马上被定时任务处理,加载到内存,状态=1,定时任务比较慢,2min处理一次,在这过程中,北京那边修改了状态=3,4,这时候定时任务处理完了,修改状态=1,状态被复原了。

修复:并发引起问题:可以加锁,故在定时任务修改数据库判断状态=1,不处理

 

总结:

我们的程序要运行,离不开CPU、内存、IO设备,但是他们三者之间的执行速度是有差异的。

CPU 的执行速度最快,内存的速度次之,IO设备的速度最慢。

为什么会有内存缓存

CPU 执行一条指令非常快,但是他从内存中读取某个数据时,就需要等待很长的时间,为了弥补速度上的巨大差异,让 CPU 不被内存拖垮,所以在 CPU 上增加了缓存。

当 CPU 请求内存中的数据时,会先查看缓存中是否有该数据,如果存在则直接返回该数据;如果不存在,则要先把内存中的数据载入缓存,然后再返回给 CPU。

所以我们的程序在执行时,往往就需要将数据从内存中读取出来载入到缓存中,然后进行处理,处理完成之后再将数据回写到内存中去。

除此以外,现代的计算机都是多CPU、多核的,程序也不再只运行在单一线程中,而是有多个线程在运行。

每个线程都会维护一份自己的内存副本,也就是 CPU 缓存,所以线程之间一定会存在数据一致性的问题。

一般来说,导致并发问题的根源不外乎以下这几个原因:

可见性:一个线程对共享变量的修改,另一个线程是否可见?

原子性:一个或多个操作在 CPU 执行的过程中是否会被中断?

有序性:程序编译后的指令是否会按照代码原本的顺序执行?

遗憾的是,以上三个问题的答案都是不确定的,正因为这些不确定所以才会存在并发下的各种问题。


线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有一下两点:

 

  1. 存在共享数据 (也称临界资源)
  2. 存在多条线程共同操作共享数据

 

只用同时满足上面两个条件,才会引发线程安全问题。

 

posted @ 2019-10-18 13:09  YOU_CAN  阅读(156)  评论(0编辑  收藏  举报