同步,异步,阻塞,非阻塞的Java例子

原创
2016/03/30 21:38
阅读数 3.7K

定义:任务A,任务B

同步:任务A和任务B之间有关联,例如任务B中途要给任务A一个数字,那么任务A或许需要等待任务B生产这个数,任务A需要等待任务B的这个动作叫做同步。

异步:事件A和事件B之间没有关联,是相互独立的,那么相互都不用管对方干了什么。

定义:线程A和线程B,分别在执行任务A和任务B

阻塞:线程A需要等待线程B,于是线程A在等待这个数的步骤上被挂起,不能分到cpu,不能执行,这样被称为阻塞。

非阻塞:线程同样需要线程B给一个数,但是线程A仅仅告知线程B要给这个数,并没有马上就要使用这个数,此时线程A没有被挂起,仍然能分到cpu,仍然能执行,这样被称为非阻塞。


因此这两对概念并没有冲突,而是能两两组合。只是由于组合后的状态使得大家误解了这两组概念。下面给出java代码上的例子,大家就能比较好的分辨了。

同步阻塞:

int i = System.in.read();

当命令终端没有输入时,调用该方法的线程被阻塞,表现出要和终端作同步。


异步非阻塞:

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



展开阅读全文
打赏
3
85 收藏
分享
加载中
JoshuaShaw博主

引用来自“雷兽”的评论

感觉 异步 的那个 应该是并行。。。。
异步的解释应该要提到 主线程和子线程 或者前台线程核后台线程
是的,同步异步其实应该是用户程序与内核之间的关系。
2016/04/05 13:16
回复
举报
感觉 异步 的那个 应该是并行。。。。
异步的解释应该要提到 主线程和子线程 或者前台线程核后台线程
2016/04/05 13:14
回复
举报
更多评论
打赏
2 评论
85 收藏
3
分享
在线直播报名
返回顶部
顶部