异步:一个请求发起后不必等待结果,继续执行下一个请求。当请求执行完成后,通过状态,通知,回调通知。

同步:一个请求完成后才能进行下一个请求。

并发:一段时间内多个程序处于开始到结束之间。

以jquery的ajax来解释同步和异步:

熟悉前端的同学都知道ajax可以配置为异步和同步,那么javascript设计为单线程的模式下真的存在异步吗?

其实javascript引擎是单线程的,但是不代表浏览器是单线程的,除了javascript引擎线程之外,浏览器还存在http请求线程,定时器线程,轮询线程。当发起ajax请求时浏览器会建立一个http线程去执行,而javascript引擎线程则继续执行列队里边的事件,当http请求完成时,http线程会在javascript执行列队里边加入回调函数等待执行。这就是ajax异步的原因,同步则会将javascript引擎线程暂时挂起,等待http线程结束。

以用户访问网站来解释并发:

当多个用户同时访问网站时,这时服务端一次只处理一个请求的话,那么用户很多的话,那得等多久。这时就要用到多线程了,多个程序同时处理请求这样就快的多了。多个程序同时执行的话就是上面所说的并发了,这时就有可能出现资源竞争的问题,就得考虑线程同步问题了。

资源竞争:包括同一个数据库内的某些数据竞争,或者同一个实例的内存竞争。

那为什么会出现资源竞争呢?

内存中有一个代码区,多个程序同时执行代码区的某个函数时,这时要么竞争数据库里边某些数据,要么就是竞争内存中的某些数据。

当遇到存取款和付款时就会有问题,那要怎么解决这个问题呢?

当某位同学去买东西时,他朋友刚好给他打款时,这时他们两同时竞争数据库的余额那笔数据。这时同一时间只能允许一个操作去修改这比数据。在执行修改金额的方法时,打款时不允许扣款的线程跑进来,或者在扣款的时候不允许打款的线程跑进来。这时就要让这两个线程同步。