一 同步
发起一个调用,被调用者如果没有处理完,那么调用者就一直等待被调用者返回
比如,程序调用A方法,如果A方法没有返回,那么程序就一直等待着
二 异步
发起一个调用,被调用者如果没有处理完,那么调用者不等待他,继续执行下面的,然后如果被调用的方法执行完了,再发起一个回调,通知调用者他执行的结果
比如,就是程序A方法,如果A方法没有返回,那么程序不等待A方法返回,继续执行下面的逻辑,执行下面逻辑的过程中,A方法执行完了,会通过回调函数告诉程序,他的执行结果是什么
三 阻塞
很让人头疼的是,同步和阻塞的区别,网上的说法也是五花八门,同步和阻塞的确相似,他们都是需要等待被调用方执行完,区别是阻塞指的是线程的状态,而同步指的是整个流程,他们关注点是不同的。同步的调动中线程可能是活的,也可能是被挂起的
比如在一个同步方法中执行了下面一段代码,这段代码中有等待,但是线程还是活的,不是阻塞block状态
count = 0;
boolean flag = true;
while(flag){
count ++;
if(count == 100){
flag = false;
}
}
下面是一段阻塞代码的栗子
ServerSocket so = new ServerSocket(8080);
// 对accept方法的调用将被阻塞,直到一个新连接建立
so.accept();
这个accept()方法就是阻塞的,在等待的过程中,线程会被挂起。上的栗子就是BIO操作的一部分代码。
这种的缺点很明显就是,每一个连接都会阻塞,如果想提高效率就要再开一个Socket连接,开连接可以使用我们熟悉的多线程模型来处理
这种方法有点是提升了效率,但是同时也增加了cpu的负担,当需要大批量的连接时,他也不能到达满意的结果
四 非阻塞
非阻塞就是调用的过程中线程会一直运行,不回挂起等待,他的实现其实是使用了选择器Selector,我们看一下非阻塞的设计模型
我们只需要开一个线程,然后通过Selector轮询访问读写操作的完成状态就可以了,这个也是NIO的模型。