定义:任务A,任务Bhtml
同步:任务A和任务B之间有关联,例如任务B中途要给任务A一个数字,那么任务A或许须要等待任务B生产这个数,任务A须要等待任务B的这个动做叫作同步。java
异步:事件A和事件B之间没有关联,是相互独立的,那么相互都不用管对方干了什么。算法
定义:线程A和线程B,分别在执行任务A和任务B并发
阻塞:线程A须要等待线程B,因而线程A在等待这个数的步骤上被挂起,不能分到cpu,不能执行,这样被称为阻塞。异步
非阻塞:线程一样须要线程B给一个数,可是线程A仅仅告知线程B要给这个数,并无立刻就要使用这个数,此时线程A没有被挂起,仍然能分到cpu,仍然能执行,这样被称为非阻塞。ui
所以这两对概念并无冲突,而是能两两组合。只是因为组合后的状态使得你们误解了这两组概念。下面给出java代码上的例子,你们就能比较好的分辨了。spa
同步阻塞:.net
int i = System.in.read();
当命令终端没有输入时,调用该方法的线程被阻塞,表现出要和终端做同步。线程
异步非阻塞:unix
Future<T> future = threadPool.submit(Callable<T> callable); ... ... ... future.get();
callable内的任务结果没有立刻须要的必要,因而调用的submit()方法立刻返回一个实现Future的存根。callable任务对于当前线程是异步的,不须要阻塞当前线程。
可是到最后当前线程须要callable任务的结果,此处就须要同步,get()方法经过阻塞来实现。
同步非阻塞:
concurrentLinkedQueue.offer((T) t);
该过程一个元素须要入队列,该并发队列为了让当前线程不阻塞(避免线程切换而耗费时间)而又能正确入队,使用CAS算法实现的乐观锁循环尝试入队。offer()方法并无阻塞当前线程,而又但愿同步,因而经过循环来实现,最终实现同步非阻塞。
异步阻塞:
没有例子。设想一下,阻塞是用来实现同步的,这样和同步阻塞有什么区别,那么实现这个还有什么用?
最后,因为仓促,可能上面有误,若是有误,请多指教,谢谢。
References & Thx:http://blog.chinaunix.net/uid-26000296-id-3754118.html