您的位置:首页 > 编程语言 > Java开发

同步,异步,阻塞,非阻塞的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代码上的例子,大家就能比较好的分辨了。

同步阻塞:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: