既然说到并发那么就先说几个相关的概念
同步与异步
同步和异步一般用来形容一次方法的调用, 同步调用一开始,调用者必须等到方法调用返回后,才能够继续后面的操作.异步调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续操作
并发与并行
并发与并行是2个容易混淆的概念,他们都可以表示2个或2个以上的任务同时执行,但是偏重点不一样,并发偏重于多个任务替换执行,而并行是真正意义上的"同时执行",严格来说,并行的多个任务是真实的同时执行,而并发来说,这个过程只是交替执行,一会运行A任务,一会运行B任务,CPU在两者之间快速切换,即使多个任务是串行并发的,由于切换速度很快,就造成了多任务间是并行运行的错觉
实际上,如果系统内只有一个CPU,而使用多线程任务,那么真实环境中这些任务是不可能真实并行的.毕竟一个CPU一次只能运行一条指令,这种情况下多线程就是并发的,而并不是并行;真实的并行只可能出现在多CPU的系统中
临界区
临界区用来表示公共资源或者说是共享数据,可以被多个线程使用,但是每一次只能有一个线程使用它,一旦临界区资源被使用时,其他线程想要使用这个资源,就必须等待,在并行的程序中,临界区是保护的对象,如果意外出现多个线程同时对临界区做出修改,那么就会造成数据的错误
阻塞与非阻塞
阻塞与非阻塞通常用来形容多线程的互相影响.比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区进行等待,等待就会造成阻塞,此刻,如果占用资源的线程一直不愿意释放资源,那么其他阻塞在这个临界区的线程都不能正常工作,非阻塞的意思与之相反,它强调的是没有一个线程可以妨碍其他线程的执行,所有线程都会尝试不断向前执行;