同线程也是一种并发模型,指的是从单线程系统扩展中出N个单线程系统。 N个单线程在系统中并行运行。同线程不等于单线程,由于,它里面也包含着多个线程。 只是每一个线程都像单线程那样运行。数据库
可能有人不理解,现现在怎么还有人设计一个单线程系统。 单线程系统流行,主要是应为它们的并发模型相对多线程系统来讲更加简单。 单线程系统没有什么数据须要和其余线程共享使用。 这就让单个线程可使用非并发的数据结构,并且还能够更好的利用CPU以及CPU内部缓存。可是,单线程系统并不能彻底发挥出现代CPU的能力。现代CPU通常都有2核,4核或者更多内核。每一个内核都是一个独立的CPU。 单线程系统只能利用一个内核。如图所示:缓存
为了充分利用CPU中的全部内核,单线程系统能够进行扩展。数据结构
同线程系统常常是每一个CPU一个线程。 若是计算机有4个CPU,或者CPU有4个内核,那就运行4个相同的“单线程”。如图所示:多线程
同线程系统中运行着多个线程,因此看起来相似一个多线程系统。 可是两个并不相等。区别就在于同线程系统中没有共享数据。 共享内存区域没有并发访问。没有并发型数据结构等等。如图所示:并发
没有共享数据,就可让每一个线程均可以像单线程系统那样运转。 同线程系统中虽然包含更多的线程,但并非“单线程系统”。 这个名字可能并不十分准确,但至少“同线程”(Same-threaded)要比“单线程设计的多线程系统”(multi-threaded system with a single-threaded design)要好不少。同线程主要意味着,数据老是被同一个线程处理。同线程系统中不存在并发数据访问。socket
明显的,在同线程系统中须要在多个单线程实例之间进行负载分配。 若是不进行分配,可能致使全部工做都由一个实例处理,那这样就成了单线程系统了。如何恰当的调度,主要取决于系统设计。下面会介绍几种状况。微服务
若是系统由多个微服务构成,每一个微服务能够以单线程模型来运行。 当在同一个机器上,部署多个单线程的微服务,每一个微服务能够在一个CPU上运行一个线程。微服务并不共享数据,所以微服务就是一个同线程系统的好例子。spa
若是系统避免不了共享数据,如只有一个数据库,那能够分片使用数据库。 分片意味着数据分布在多个数据库中。 在分片时把逻辑关联的数据放在一个数据库中。对于实例来讲,就感受数据都在一个数据库中。更多关于分片的资料,能够自行搜索。.net
在同线程模型中,若是线程之间须要通信,会在线程之间进行消息发送。 A线程想要发送消息给B线程,那A线程产生消息,而后B线程能够复制这个消息并读取。 经过复制消息,能够确保线程A不会在线程B读的时候修改数据。 这就相似不可变数据。如图所示:线程
线程通信还能够经过队列,管道,unix sockets套接字,TCP通信等等。
每一个系统都已同线程的方式运行,那就能够以单线程的方式处理。 这就意味着内部并发模型能够更加简单。 那就无需担忧并发数据结构等其余并发问题了。
单线程系统
多线程系统
同线程系统
Netty 4 的线程模型其实就是一个同线程系统
转自 https://my.oschina.net/roccn/blog/1362847