【高并发】多线程和高并发提纲

最近正在准备面试,对多线程和高并发相关问题整理了一个提纲。

个人感觉这三大部分由底向上,足够展开对并发编程中大部分问题的讨论~

三大源头

  • 线程切换带来的原子性问题
    • 原子操作:利用CPU提供的原子操作指令、编程语言对这些指令的API封装。
    • CAS算法:比较并交换,ABA问题(至少三个线程做CAS产生了错误的过程)用版本号解决。
  • CPU缓存带来的可见性问题 :程序员要编写符合Happens Before(可见性规则)的代码保证可见性。
  • 编译器带来的有序性问题:这种问题通常会出现在涉及到共享数据的多线程编程中,因为编译器的优化可能会导致操作的重新排序,从而破坏了程序的预期行为,例如导致可见性问题。

两个主要问题

  • 竞态条件。强调并发执行顺序带来的结果不一致。先判断后执行竞态条件、读-操作-更新竞态条件(i++)。
  • 数据竞争。强调并发读写导致的未定义行为,可能会引起程序的崩溃。

三大解决方案:进程多线程与高并发的解决方案。

  • 同步:也就是利用原子操作或者锁。使用(悲观)锁,缺点是大量使用锁让很多逻辑都变成同步,效率可能还不如单线程。
  • 数据分片:根据数据所有者划分出数据主体(Actor),每个主体在自己对应的线程中处理/访问自己的数据。
  • 分布式架构:对逻辑进行划分,也是数据分片的一种思路,采取分布式架构,进一步提高并发量。