zoukankan      html  css  js  c++  java
  • 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. 存在多条线程共同操作共享数据

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

  • 相关阅读:
    AN BD FD DD CD UT CT TT IT ST UAT OP
    log4j
    重构代码
    with as sql的优化
    svn locked,并且无法clean up 的解决方法
    去掉Eclipse中没用的workspace
    getHibernateTemplate()的get方法
    Java反射
    windows 右键新建html文档
    fiddler 针对单个接口打断点
  • 原文地址:https://www.cnblogs.com/wanghongye/p/11697764.html
Copyright © 2011-2022 走看看