同步/异步&阻塞/非阻塞
平时开发中经常会听大家说到什么同步阻塞、异步非阻塞等等名词,这里我谈下自己对这两个名词的理解,仅仅是个人观点,并不一定正确。
1.阻塞/非阻塞
我认为判定阻塞还是非阻塞,取决于线程所做的操作是否需要将线程挂起等待。
举个例子,我们都知道CAS是非阻塞的,而synchronized是阻塞的。为什么呢,因为CAS能快速返回一个获取锁成功或失败结果,线程可以在获取锁失败时再去做其他事情,而synchronized在线程获取锁失败后会将线程挂起,直到锁释放后才可能被重新唤醒,这期间线程一直处于blocked的等待状态。
1.同步/非同步
我认为同步还是非同步,取决于是否是当前线程亲自执行操作。若当前线程亲自执行操作则为同步,当前线程通过创建或利用其他线程执行操作则为异步。
同样举个例子,我们都知道Nio和Aio,一个为同步非阻塞,一个为异步非阻塞。在Nio中所有的业务线程会将关注的读写事件和回调接口注册到事件中心,通过事件管理线程不停的循环检测是否有就绪的事件,如果有事件管理器就会调用回调接口,业务线程就会去进行相应的读写操作和业务逻辑。而区别于Nio,在Aio中业务线程会直接向操作系统提出一个异步IO的请求,然后将回调函数和相关信息注册到事件中心,操作系统会异步的进行相应IO读写操作并将结果写到指定内存地址,操作完成后由事件管理器调用业务线程的回调接口,业务线程直接使用内存数据。两者之前的区别在于是否为业务线程亲自进行读写操作。