并发是什么
并发(concurrent),意指多个线程同时工作(多个事件同时发生)。实际上并没有同时发生,在单个处理器的情况下也不可能同时发生,只不过是由CPU快速的切换Context(程序运行上下文),造成了多个线程同时执行的错觉(CPU 对每个线程雨露均沾)。
多个线程通过 CPU 快速切换 Context 并发执行,那么问题就来了:
- 线程执行顺序由 CPU 决定。如果不使用程序手段来控制,则整个程序的执行就变得不可控。在某些既需要高 CPU 执行性能又需要线性执行的步骤中,就需要对 CPU 调度顺序进行限制和规定
- CPU 切换上下文是一个很消耗资源的操作。CPU 需要将先前执行的 A 线程的本地数据、程序指针暂存,然后载入线程 B 的本地数据、程序指针,开始执行 B 线程。
- 多个线程访问资源的一致性问题。原来是一个线程 T 访问一个资源 S,没有问题,一切井然有序。并发环境下,多个线程 T1、T2、T3……访问资源 S 。但是,线程执行(访问资源这个操作)是有可能会被 CPU 中途打断的,想想食堂打饭的场景,你和阿姨说来一份红烧肉,阿姨收到打红烧肉的指令,在你等待的间隙,突然霸道的小名冲过来把你挤走,啪,你要的红烧肉落在了小明的碗里,你说你爽不爽
怎么解决并发问题
并发环境下出现数据不一致的原因就是 CPU 在不该切换 Context 的时候切换,比如一个线程还没有完全执行完的时候,如果能人为的限制 CPU