java并发编程02:同步与异步、阻塞和非阻塞

同步与异步

多线程程序并发时,多个线程同时请求一个资源,必然导致此资源数据不安全。比如A线程修改了B线程处理的数据,而B线程又修改了A线程处理的数据。显然这是由全局资源(堆,方法区等)照成的。有时为了解决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,处于这样的安全考虑就必须牺牲系统的处理性能。加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制

同步:A线程请求某个资源,但此资源正在被B线程使用中,因为同步机制的存在,A线程请求不到,怎么办,A线程只能等待下去

异步:A线程请求某个资源,但此资源正在被B线程使用中,因为没有同步机制的存在,A线程仍然请求到资源,A线程无需等待。

显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个进程崩溃,但没有同步机制的存在,性能会有所提升

举例说明:A调用B

同步请求:A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。

异步请求:A调用B,B的处理是异步的,B在接到请求之后,先告诉A我已经接到请求了,你现在去忙你自己的吧,然后B处理完之后通过回调等方式再通知A。

所以说,同步和异步最大的区别被调用方的执行方式和返回时机,同步指的是被调用方做完事之后再返回,异步指的是被调用方先返回,然后在做事情,做完之后在想办法通知调用方。

阻塞和非阻塞

阻塞:调用结果返回之前, 当前线程会被挂起. 函数只有在得到结果之后才会返回, 线程需要等待结果.

非阻塞: 与阻塞的概念相对应, 指在不能立刻得到结果之前, 该函数不会阻塞当前线程, 而会立刻返回. 线程不需要等待结果.

举例说明:A调用B

阻塞请求:A调用B,A一直等着B的返回,别的事情什么也不干。

非阻塞请求:A调用B,A不用一直等着B的返回,先去忙别的事情了。

所以说,同步和异步最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。

阻塞、非阻塞和同步、异步的区别

首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不一样的。阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。

有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。

猜你喜欢

转载自www.cnblogs.com/mengY/p/12214410.html