一、线程的相关概念
1.同步和异步
用一次方法调用来说:
同步方法一旦调用开始,便必须等到方法调用返回后,才能继续后面的行为。
异步方法更像是一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。异步方法通常会在另外一个线程中"真实"地运行。整个过程,不会阻碍调用者的工作。
示例:
淘宝上购物,我们只需要把商品加入购物车,付款就好了,其他物流配送的环节都是异步执行的。
2.并发和并行
并发:多个任务交替运行
并行:多个任务平行的运行
一个CPU的话,肯定是并发。并行只能发生在多个CPU的情况下。
3.临界区
临界区来表示一种公共资源或者是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程想要这个资源,就必须等待。
举例:
一个办公室只有一台打印机,小名和小刚同时需要打印文件,很显然,只能一个一个来。这里的打印机的例子就是一个临界区。
4.阻塞和非阻塞
阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作。
非阻塞的意思与之相反,他强调没有一个线程可以妨碍其他线程执行。所有的线程都会尝试不断向前执行。
5.死锁、饥饿 、活锁
死锁: A车想入库,B车想出库。结果谁也不让谁。这时候就是死锁。
饥饿: 某个线程由于种种原因无法获得想要的资源,导致一直无法执行。比如他的线程优先级过低,而高优先级的线程不断抢占他的资源,导致低优先级线程无法工作。
举例:自然界中,母鸟喂食雏鸟时,很容易出现这种情况。由于雏鸟比较多,食物有限,雏鸟之间的竞争可能很激烈,小雏鸟因为经常抢不到食物,可能被饿死。
活锁: