文章目录
- 三大源头
- 两个主要问题
- 三大解决方案
最近正在面试,对多线程和高并发相关问题整理了一个提纲。
个人感觉这三大部分由底向上,足够展开对并发编程中大部分问题的讨论~
三大源头
线程切换带来的原子性问题。
- 原子操作:利用CPU提供的原子操作指令,以及编程语言对这些指令的API封装。
- CAS算法:比较并交换,ABA问题(至少三个线程做CAS产生了错误的过程)用版本号解决。
CPU缓存带来的可见性问题:程序员要编写符合Happens Before
(可见性规则)的代码保证可见性。
编译器带来的有序性问题:这种问题通常会出现在涉及到共享数据的多线程编程中,因为编译器的优化可能会导致操作的重新排序,从而破坏了程序的预期行为,例如导致可见性问题。
两个主要问题
竞态条件。强调并发执行顺序带来的结果不一致。先判断后执行竞态条件、读-操作-更新竞态条件(如i++
)。
数据竞争。强调并发读写导致的未定义行为,可能会引起程序的崩溃。
三大解决方案
同步:也就是利用原子操作或者锁。使用(悲观)锁,缺点是大量使用锁让很多逻辑都变成同步,效率可能还不如单线程。
数据分片:根据数据所有者划分出数据主体(Actor),每个主体在自己对应的线程中处理/访问自己的数据。
分布式架构:对逻辑进行划分,也是数据分片的一种思路,采取分布式架构,进一步提高并发量。