同步与异步、阻塞非阻塞

一、 同步与异步:

强调用户线程和内核的交互方式

同步:用户线程发起IO操作需要等待或者轮询内核是否完成IO操作
异步:用户线程发起IO操作后无需等待,可以执行其它操作

  • 同步和异步关注的是消息通信机制,由调用者主动等待这个调用的结果,异步是当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。执行某个功能会被调用者是否会主动反馈信息

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。执行某个功能后调用者是否一直要等待结果的反馈

  • 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

二、 阻塞与非阻塞:

强调用户线程调用内核IO操作时的状态

阻塞:用户线程调用内核IO后被挂起
非阻塞:用户线程调用IO后直接返回状态,回调函数通知

一个例子(引自知乎):
1.老张把水壶放到火上,立等水开。(同步阻塞)

2.老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)

买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。

3.老张把响水壶放到火上,立等水开。(异步阻塞)

老张觉得这样傻等意义不大

4.老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下,cpu密集型。
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。

简单的说:

  • 在处理IO的时候,阻塞和非阻塞都是同步IO。
  • 只有使用了特殊的API才是异步IO。
三、socket

套接字,封装通信协议为网络通信提供接口,两台主机之间逻辑连接的端点,一般封装ip,端口号,协议

java网络通信简单流程

  • 服务端实力化ServerSocket对象(绑定端口)

  • 服务端调用accept()方法监听客户端的请求

  • 服务端等待时,客户端实例化一个socket对象,指定服务器名称和端口号连接

  • 连接建立成功,服务端会返回一个新的socket,用来和客户端进行通信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值