同步与异步
同步:A任务依赖B任务,只有B任务完成,A任务才算完成,两个任务状态保持一致,有点同生共死的味道,是一种可靠的任务序列。
异步:A任务依赖B任务,但只是通知B任务,并不等B任务完成,只要A自己完成就算完成任务了,至于B是否完成就不一定了,故是一种不可靠的任务序列。
即同步保证程序可靠性,异步提升程序性能。
同步:流程处理结果简单;易于捕获异常
异步:没有时序严格限制,不影响主线程逻辑,常用IO等耗时操作
阻塞与非阻塞
阻塞:进程在发起了一个系统调用后,由于该操作不能立即完成,需等待, 于是内核将进程挂起为waiting状态, 失去CPU执行权,等操作完成后,再设为ready
非阻塞: 不会失去CPU执行权
不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。
线程阻塞三种情况:
1.等待阻塞:运行时线程执行wait(),JVM把线程放入等待池中,线程释放锁
2.同步阻塞:运行线程等待获取锁,JVM把线程放入锁池,线程释放锁
3.其他阻塞:运行线程调用sleep(),join(),或者发出I/O请求,JVM将线程设为阻塞状态。sleep不释放锁
同步与阻塞
初看起来,同步与阻塞很相似,都是在等,但二者其实是两个不同概念。同步指调用得不到结果就不返回,这一过程不一定阻塞。
CPU可能仍在执行程序,只是没有返回结果,此时仍是非阻塞.