先抛定义
同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。这时程序是阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。 因此 简单的说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
异步,与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。
再举例子
同步,就是实时处理(如打电话),比如服务器一接收客户端请求,马上响应,这样客户端可以在最短的时间内得到结果,但是如果多个客户端,或者一个客户端发出的请求很频繁,服务器无法同步处理,就会造成涌塞。
同步如打电话,通信双方不能断(我们是同时进行,同步),你一句我一句,这样的好处是,对方想表达的信息我马上能收到,但是,我在打着电话,我无法做别的事情。
异步,就是分时处理(如收发短信),服务器接收到客户端请求后并不是立即处理,而是等待服务器比较空闲的时候加以处理,可以避免涌塞。
异步如收发收短信,对比打电话,打电话我一定要在电话的旁边听着,保证双方都在线,而收发短信,对方不用保证此刻我一定在手机旁,同时,我也不用时刻留意手机有没有来短信。这样的话,我看着视频,然后来了短信,我就处理短信(也可以不处理),接着再看视频。
代码中的同步和异步
对于写程序,同步往往会阻塞,没有数据过来,我就等着,异步则不会阻塞,没数据来我干别的事,有数据来去处理这些数据。
同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行(死心眼)。
异步在一定程度上可以看做是多线程的,请求一个方法后,就不管了,继续执行其他的方法。
举例
同步
甲乙现在各要打印一份文件(一人一台电脑连接打印机),共享一台打印机。两人同时在自己电脑上操作打印文件。那么这个时候问题来了,如果打印机同时响应两个人的请求,那么是先打印甲的还是乙的,或是两份文件错乱?面对这样的问题,同步机制就起作用了。当甲乙两个人发出打印请求后,两个线程竞争资源,当甲的线程竞争到资源(打印机)后,乙的线程就一直等待,直到甲的任务完成结束对资源的使用,乙的打印任务才开始。
异步
当我们使用浏览器的时候,通常都是多开网页的。你打开一个360浏览器(此时便创建了一个进程),然后打开一个网页看小说(线程1),同时打开一个网页看电视剧(线程2)。这两者便是异步。
多线程中使用场景
多线程环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,他们需要以某种顺序来确保该资源在某一时刻智能被一个线程使用,否则程序的运行结果将不可预料,在这种情况下就必须对数据进行同步。