基本概述基
同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;
异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。
这就是同步和异步。举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;
而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。
代码表示同步和异步
**
void fun1() {
}
void fun2() {
}
void function(){
fun1();
fun2()
.....
.....
}
这段代码就是典型的同步,在方法function中,fun1在执行的过程中会导致后续的fun2无法执行,fun2必须等待fun1执行完毕才可以执行。
接着看下面这段代码:
void fun1() {
}
void fun2() {
}
void function(){
new Thread(){
public void run() {
fun1();
}
}.start();
new Thread(){
public void run() {
fun2();
}
}.start();
.....
.....
}
这段代码是一种典型的异步,fun1的执行不会影响到fun2的执行,并且fun1和fun2的执行不会导致其后续的执行过程处于暂时的等待。
因此,个人觉得同步和异步可以表现在很多方面,但是记住其关键在于多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。一般来说,可以通过多线程的方式来实现异步,但是千万记住不要将多线程和异步画上等号,异步只是宏观上的一个模式,采用多线程来实现异步只是一种手段,并且通过多进程的方式也可以实现异步。
同步和异步
同步和异步都是基于应用程序和操作系统处理IO时间锁采用的方式,
同步:应用程序要直接参数IO读写的操作,同步的方式在处理IO事件的时候必须阻塞在某个方法上面等待我们的IO事件完成(阻塞IO事件或者通过轮询IO事件的方式)
异步:所有的IO读写交给了操作系统来处理,这个时候我们可以去做其他的事情并不需要去完成真正的IO操作,当操作系统完成IO过后给我们的应用程序一个通知就可以了,然后我们的应用程序得到通知就给数据拿走.
区分同步或异步(synchronous/asynchronous)。简单来说,同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。
同步
1.阻塞到IO事件,当没有数据可读的时候就阻塞read或者write方法上面,这个时候我们就完全不能做自己的事情,在jdk1.4之前我们可以进行线程的切换,让读写方法加入到线程里面,阻塞线程的方式来实现,对线程损耗,性能开销比较大.
2.IO事件的轮询 —多路复用技术(select模式)
读写事件交给一个单独的线程来处理,这个线程完成IO事件的注册功能,还有就是不断的去轮询我们的读写缓冲区,看是否有数据准备好,准备好了就通知我们相应的读写线程,这样的话以前的读写线程就可以做其它的事情,这个时候阻塞的不是所有的IO线程,阻塞的是select这个线程,
Client客户端 Select管家 BOSS
当客人来的时候,就给管家说,我来了,管家得到这个注册信息后,就给BOSS说,我这里有一个或多个客人,BOSS说你去给A客人这样东西,给另外人B客人这样东西,这个时候,客户是可以去做自己的事情的,比如看看花园等等,当关键知道boss给他任务后,他就是去找对应的某人,告诉他boss给他某样东西(这个某样东西是根据我们的注册信息)
异步
所有的IO操作都交给了操作系统,其它你不用关心,你自己做你想做的事情就行了,等操作系统完成所有的IO过后呢,你可以把操作系统准备好的数据都读了.