问题:

过程:

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

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

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

总结:

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

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

为什么会有内存缓存

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

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

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

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

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

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

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

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

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

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

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

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

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

java的并发的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  3. 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  4. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  5. 【实战Java高并发程序设计 5】让普通变量也享受原子操作

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  6. 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray

    除了提供基本数据类型外,JDK还为我们准备了数组等复合结构.当前可用的原子数组有:AtomicIntegerArray.AtomicLongArray和AtomicReferenceArray,分别表 ...

  7. 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference AtomicReference无法解决上述问题的根 ...

  8. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  9. Java多线程-并发容器

    Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...

  10. 《Java虚拟机并发编程》学习笔记

    对<Java虚拟机并发编程>这本书真的是相见恨晚.以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识.所以把书上的知识点做下笔记,以便以后复习使用. 并发与并行 仔细说来, ...

随机推荐

  1. Java【第一课 java基本结构】

    一.java基本结构 上面是java的基本组成,包括外层的框架.java入口程序框架 二.java的第一个程序 首先创建一个文件,名字叫做helloworld.java,后缀名为java public ...

  2. Vue图片验证码-自定义组件高级版

    最近项目中要用到图片验证码,网上一查有很多,基本都是千篇一律的4位纯数字验证码.首先得感谢那位一代目兄台提供的模板,由于不能满足需求,所以对其进行了改造升级. 经改造的图片验证码能满足一下情形使用:① ...

  3. Cmake编译库注意

    在生成工程文件后要在Debug x64模式下菜单栏选择:生成->生成解决方案,等10几分钟然后在Cmake Targets下INSTALL,点击“仅用于项目->仅生成INSTALL”,然后 ...

  4. node--处理一个增加上传操作和渲染页数条

    一段学习的结束 我也不知道我这是在写些什么,只是觉得学完了一些东西,就是想把它记录 一下,这样我就可以知道我是学过这一块的,要多激励自己,^^O(∩∩)O哈哈~ 以下内容并不完全与标题匹配,不过以下内 ...

  5. Centos7 Python2 升级到Python3

    1. 从Python官网到获取Python3的包, 切换到目录/usr/local/src wget https://www.python.org/ftp/python/3.7.2/Python-3. ...

  6. 航空航天专用Everspin非易失性MRAM存储器

    TAMU是由瑞典乌普萨拉的Ångström航空航天公司(ÅAC)开发的高级磁力计子系统.TAMU的目的是提供地球磁场的磁力计数据,以便与子画面观测相关.实验性TAMU由使用领先技术制造的四种类型的设备 ...

  7. oracle备份与还原数据

    一.表数据备份与还原 creat table  备份表   select * from  原表  where insert  into  原表  select  *  from  备份表 二.利用备份 ...

  8. 【巨杉数据库SequoiaDB】社区分享 | SequoiaDB + JanusGraph 实践

    本文来自社区用户投稿,感谢小伙伴的技术分享 项目背景 大家好!在春节这段时间里,由于一直在家,所以花时间捣鼓了一下代码,自己做了 SequoiaDB 和 JanusGraph 的兼容扩展工作. 自己觉 ...

  9. 0011 基于DRF框架开发(04 普通序列化器)

    普通序列化器和模型无关,只是对针对提交字段的定义. 本文定义三个序列化器: 教师序列化器,学生序列化器,教师学生序列化器.这三个序列化器都使用普通序列化器. 1 教师序列化器 在Application ...

  10. JavaDay9(下)

    Java learning_Day9(下) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...