zoukankan      html  css  js  c++  java
  • 从头认识java-17.4 具体解释同步(2)-具体解释竞争条件

    这一章节我们来具体讨论一下竞争条件。

    1.为什么会引起竞争条件?

    因为操作缺失原子性。


    2.什么是原子性?

    所谓原子操作是指不会被线程调度机制打断的操作;这样的操作一旦開始,就一直运行到结束。中间不会有不论什么 context switch (切换到还有一个线程)。


    3.分解上一章节转账的步骤:

    (1)读取某个账户的剩余金额。对照提取的金额

    if (accounts[fromAccount] < money) {
    			return;
    		}

    (2)从A账户转出XXX元

    accounts[fromAccount] -= money;


    (3)从B账户转入XXX元

    accounts[toAccount] += money;


    4.因为不具备原子性,并且是多线程运行,因此我们能够如果:

    (1)如今线程A已经运行了上面的第一第二步

    (2)如今线程B启动。对相同的账户进行上面的第一第二步

    (这个时候已经出错了)

    (3)线程A再运行第三步

    (4)线程B再运行第三步

    循环....

    我们上面仅仅是列出两个线程同一时候工作的情况,可是我们的測试程序开了20个线程。如果现实其中可能是20000甚至2000000个线程,数据直接就乱套了。


    5.步骤图:



    6.更糟的情况

    因为决定这个误差出现的概率是由步骤2到步骤3之间的时间控制的,时间越长,误差出现的概率越高。


    总结:这一章节主要具体讨论了竞争条件。


    这一章节就到这里,谢谢。

    -----------------------------------

    文件夹




  • 相关阅读:
    如何手动同步 Chrome 浏览器的数据
    如何释放 Windows 10 系统的 C 盘空间
    Foxmail
    常用 Git 命令
    常用的 .gitignore 模板
    MySQL InnoDB Engine--数据页存储和INSERT操作
    MySQL InnoDB Engine--数据页存储和ALTER TABLE操作
    MySQL InnoDB Engine--数据页存储
    MySQL Index--BAK和MRR演示
    MySQL Execute Plan--Index Merge特性
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7262718.html
Copyright © 2011-2022 走看看