Java多线程高并发基础篇(一)-必须知道的基础概念

对于多线程高并发,我们必须要知道这里面涉及的基本概念,就像学武功一样,在学习成套招式的时候,你必须要学会扎稳马步.

我们先介绍多线程高并发中必须知道的几个概念.

1.同步和异步

同步和异步,通常用来形容一次请求调用.我们在做前端开发中经常涉及,例如ajax的同步异步请求.那什么是同步和异步?

同步是指请求调用一旦开始就必须等待这个请求处理完成,才能进行后续的行为.比如说,小明有个生活习惯,每天都是吃饭睡觉打豆豆.在睡觉之前必须吃饭,在打豆豆之前必须睡好觉.

那什么是异步呢?异步就是请求发起后,我们不需要等待它完成,而真实的请求会由另外一个线程去执行.如果异步请求需要返回结果,那么当异步请求调用完成后,它才会通知调用者真实的结果.

有个很经典的例子,是老王烧水的故事.(我突然想起了我们的同事老司机)

老司机是个爱学习的员工.有一天,老王要烧水.他灌好水,放在火炉上,因为不知道什么时候水会开,所以老司机必须一直盯着水壶的水(老司机你是不是傻?),然后水开后就去学习了.这就是同步的例子,灌水-->等待水开-->学习.

突然一天,老司机发现自己太傻了,于是老司机买了一个响水壶,水烧开后,他会自己"滴滴滴"的响.于是流程变成了这样子,老司机灌好水,放在炉子上,然后就去学习了.当水开了,水壶就响了,老司机就知道水开了.这就是异步的例子.

2.并发和并行

并发和并行,在面试中常问.

如果接触过操作系统这门课,我们应该知道,在计算机中,同时执行多个任务,在操作系统中是分时间片执行的,但是这个细节对外是透明的.所以,我们的计算机才能看起来同时执行多个任务.

严格意义上讲,并行是真实的多个任务在同时执行,这得益于我们科技的发展,因为我们的电脑基本都是多核的(多个处理器).因此能够真正意义上实现任务并行执行.

如果系统中只有一个核心(单CPU),任务就是并发执行的.因为只有一个处理器,大家只能根据分配到的时间片去执行自己的任务,所以我们觉得以前的电脑真是卡的不要不要的.

3.临界区

在多线程中,临界区是指多个线程要同时访问的公共资源或者共享数据.但是这个区域在一个时刻只能由一个线程使用,一旦有线程获取到,那么其他线程就必须等待了.

4.阻塞和非阻塞

阻塞和非阻塞通常是用来形容多个线程之间的相互影响的.比如一个线程占用了临界区,那么其他线程就不得不等待,也就是说其他线程被阻塞了,这就是阻塞的情况.非阻塞的情况与阻塞相反,就是多个线程可以同时进入,你不阻挡我,我不阻挡你.

5.死锁,饥饿,活锁

死锁,饥饿,活锁是多线程的跃性问题.

死锁(Deadlock)是最坏的一种情况,因为没有一个线程能继续执行.比如四辆车头顶头形成了环.现在明白交通信号灯的用处了吧.

饥饿(Stavation),是指一个或者多个线程因为某些原因一直得不到所需要的执行资源(CPU资源),导致一直没法执行,在非公平锁的情况下会出现饥饿现象.比如,我们在吃饭的时候,你跟服务员点了菜,比你先来的人都吃上了,你还没吃上,你不饿还有谁饿.哈哈,所以,后来才有了叫号机(请xx号取餐,多么熟悉的声音).

活锁(Livelock),是指线程秉承着谦虚礼让的原则,只要别的线程要使用资源,它就主动将资源释放给人家使用.如果两个线程都很礼让,都主动让资源,就会形成活锁的情况(这线程是不是傻?).比如,走路时候,你跟一个人迎头碰上了,两人都互相让路,然后一直没走下去.[捂脸]


 

猜你喜欢

转载自zhaodengfeng1989.iteye.com/blog/2415062