同步,异步,阻塞,非阻塞的Java例子
2016-04-05 13:14
369 查看
摘要: 聊聊同步,异步,阻塞,非阻塞这四个概念,再给出一些代码上的例子。
定义:任务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代码上的例子,大家就能比较好的分辨了。
同步阻塞:
当命令终端没有输入时,调用该方法的线程被阻塞,表现出要和终端作同步。
异步非阻塞:
callable内的任务结果没有马上需要的必要,于是调用的submit()方法马上返回一个实现Future的存根。callable任务对于当前线程是异步的,不需要阻塞当前线程。
但是到最后当前线程需要callable任务的结果,此处就需要同步,get()方法通过阻塞来实现。
同步非阻塞:
该过程一个元素需要入队列,该并发队列为了让当前线程不阻塞(避免线程切换而耗费时间)而又能正确入队,使用CAS算法实现的乐观锁循环尝试入队。offer()方法并没有阻塞当前线程,而又希望同步,于是通过循环来实现,最终实现同步非阻塞。
异步阻塞:
没有例子。设想一下,阻塞是用来实现同步的,这样和同步阻塞有什么区别,那么实现这个还有什么用?
最后,由于仓促,可能上面有误,如果有误,请多指教,谢谢。
References & Thx:http://blog.chinaunix.net/uid-26000296-id-3754118.html
定义:任务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
相关文章推荐
- JavaWeb——文件上传和下载
- springMVC 项目根路径访问页面配置
- Java 8新特性-1 函数式接口
- Java笔记 - 线程基础知识
- # 20145334赵文豪 《Java程序设计》第5周学习总结
- 根据依赖来编译java文件,生成class
- java 抽象类与接口的区别
- java 删除linkedlist链表中重复元素
- SpringMVC - Controller 返回值的可选类型
- 由浅入深学Java Socket
- 解决eclipse闪退
- Java eclipse生成doc文档
- Java实现大数相乘
- CompressFile工具类使用,zip和rar文件解压缩与打包操作Java源代码
- 将protege-owl API的doc文档添加到eclipse的编程坏境中
- Java入门:创建多个对象
- mybatis学习笔记二mybatis结合spring mvc实现(用户登录,数据查询)
- spring-boot启动不了,报错 java.lang.NoClassDefFoundError: javax/servlet/ServletContext
- Spring Bean在XML配置中的父子继承
- Java enum的用法详解