这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
单线程并发
单线程并发意味着在单一线程上,一次性对多个任务取得进展。常规上 主要是利用多线程进行多任务的同时处理,每个线程均在自己的线程对应的任务上取得进展。使用传统的多线程并发,不同任务之间的切换是利用操作系统与cpu完成的。而使用单线程并发技术,可以在单个线程上,对不同任务来回切换,同时取得多任务的进展。
单线程并发仍然属于新领域
- Netty、Vert.x 和 Undertow等高性能工具包均使用单线程并发的思想进行设计。同样,目前很流行的语言nodejs核心设计也是属于单线程设计。Vert.x 和 Undertow底层均采用netty框架,也就是对于netty的线程模型的引用。
- netty的线程模型以事件轮询为核心概念。通过不停的寻找系统中发生的事件,对事件进行响应,因此执行对应的代码逻辑。
- 事件循环的方式对于某些系统有价值,而对于另一些系统并不适用。
经典多线程并发
- 在经典多线程并发中,通常会给每个任务分配一个单独的线程,每个线程每次仅执行一个任务,由操作系统或cpu进行调度。在一些设计中,会为每个任务直接创建新线程,这种方式当任务结束时,线程会自动死亡。另一种方式则是采用线程池,当线程结束时会返回到线程池中等待新任务的到来。
- 多线程的优点是轻易的将任务分配给多个线程、多个cpu进行执行。底层的cpu会通过调度让系统并发的进行多个任务的同步执行。
- 而与此同时,如果多个线程对于数据结构处于共享的状态,则也可能会出现很多并发问题,比如死锁、竞争条件等等。常规来讲,当多线程间共享的数据结构越多,出现并发问题的概率也会随之升高。因此对于多线程的设计是一个关键环节。
- 当多个线程尝试同时访问相同的数据结构时,经典的多线程架构有时也会导致拥塞。根据给定数据结构的实现程度,某些线程可能会被阻塞以等待访问,而其他线程正在访问该数据结构。
未完待续
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。