菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
436
0

从头认识java-17.4 具体解释同步(2)-具体解释竞争条件

原创
05/13 14:22
阅读数 19058

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

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之间的时间控制的,时间越长,误差出现的概率越高。


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


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

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

文件夹




发表评论

0/200
436 点赞
0 评论
收藏