在单一线程执行的情况下,并不用考虑任何数据一致性与同步等问题,但到了多个线程执行的情况下,共享数据的同步就显得至关重要了。比如有一个银行账户的操作问题(例子来自Wikipedia),现在有两个线程A与B共享一个账户变量balance
,这个提款的操作有两个部分,首先需要判定提款数目是否小于当前账户存款,记为s1
;如果该条件满足,则从账户中提取资金,记为s2
。假定开始时账户balance=600
,现在A调用withdraw(200)
,B调用withdraw(500)
,如果两个线程A与B调用时,s1
都发生在s2
之前,则两个线程都可以进入判定条件,提取相应的资金,而实际的存款是小于两个线程需要提取的资金的。
1 2 3 4 5 6 7 8 9 10 11 12 13
| bool withdraw(int withdrawal) { if (balance >= withdrawal) { balance -= withdrawal; return true; } return false; }
|
这种线程之间共享资源的一致性同步问题在并发编程中十分常见,通常被称为Data Race。根据官网上的定义(what is data race),Data Race出现是由以下原因导致:
- 多个线程同时访问共享内存;
- 至少有一个线程写该共享内存区域;
- 线程访问共享内存并没有利用锁进行同步;