引言
i++
这个简单的语句,想必大家都不陌生,但是在多线程环境下,如果 i
是一个全局共享变量,那么它还能正确地按顺序累加吗?这就是本文要介绍的内容,如何保证统计变量的原子性。
其实,i++
是由 “读取-修改-写入” 三个操作序列组成的复合操作,要保证它们的原子性,否则就会出现数据不一致的情况。补充一下,什么是原子操作?原子操作,笔者最初是从《数据库原理》一书中了解到的,应用于事务上,事务的 ACID
四种特性,第一个就是 Atomic
原子性,它指由一组操作组成的操作集合,它们要么都做、要么都不做。i++
,就是这类操作。
本文是根据笔者几年前的一篇旧文整理的,那时刚入行两年,并发编程经验几乎为零。
i++ 数据不一致案例分析
案例描述
笔者早年参与的一个项目,需要对某个 http
请求结果进行统计,得出失败和成功的请求总数。一起开发的同事定义了两个全局变量 Commo