Java并发编程学习笔记—为什么要学习并发编程

关于并发编程,无论是面试还是实际项目应用来说都是必不可的一部分。所以也激发了系统学习这块知识的决心。在参考《并发编程艺术》这本书的情况下,加上学习其他博客/专栏的路线,整理出学习笔记。虽然见解不深,但是相信通过不断的揣摩和研究,先把基础夯实。学习是没有止境的事情,你也不是比别人有多优秀,只是好多人在中途放弃了。

开胃汤:

线程相关的概念:

进程:什么是进程?在windows的资源管理器中,每个正在运行的exe程序都是一个进程。进程占用着cpu,内存,磁盘,网络等资源。站在操作系统的层面上来说进程是分配资源的基本单位,也是最小单位,换种说说法也就是受操作系统管理的基本运行单元。(我们的程序代码也是进程的一部分)。

线程:可以理解为进程中独立的子任务,一个进程中至少存在一条线程。线程是进程中负责程序执行的执行单元,也就是实际功能的执行者。举个例子:看直播的时候,可以看直播的时候发送弹幕,还可以参与抽奖。而每个功能执行的背后都是通过线程来执行。那么多个任务同时执行也就是常说的多线程。

串行:多个程序在一个CPU上排队执行,比如在电影院买票,只有一个窗口,大家按部就班的排队买票(单核CPU上执行程序)

并行:多个程序同时在多个CPU上执行。还是买票的例子,买票的人太多了,电影院又开了几个窗口同时买票,效率高了不少。

并发:多个程序在一个CPU上运行,CPU在多个程序之间快速切换,微观上不是同时运行,任意一个时刻只有一个程序在运行,但宏观上看起来就像多个程序同时执行。电影院的例子:电影院增加改签服务,同时售票员get一像新技能,即能同时卖票,在出票的同时还能办理改签业务。

同步:在发出一个调用时,在没有得到结果之前,该调用就不返回。栗子:在电影院买票的同时,你得等到票出来了才能离开。 异步:在发出一个异步调用后,调用者不会立刻得到结果,该调用就返回了。栗子:退票,售票员处理后,钱会直接退回到你支付宝里,你不用等着领了钱再走。

说了那么多概念以后,终极问题来了,为什么要使用多线程?

总结出来就是了为了提高程序运行的效率,提高资源的利用率。

举个例子:在单核CPU下执行两个任务,一个需要执行10秒,一个需要执行1秒,在单线程的环境下,两个任务执行完成需要11秒。而在多线程的环境下,线程通过上下文的快速切换,在10秒任务线程等待期间,释放CPU,1秒任务线程获得CPU的使用权执行完毕,然后释放CPU的使用权,10秒任务继续执行,直到结束。两个任务总执行时间是10秒。相比单线程情况下,效率提高了1秒,CPU得到了更充分的利用。这是多线程的优点,也是为什么会使用多线程技术。

这种肉眼可见的同时进行,其实并不是真正的同时进行,只是线程之间的切换速度很快,看似同时进行。

不过随着硬件的发展,动辄就八核甚至更多核的CPU越来越普及,多线程带来的优势越来越明显,同时并发场景下带来的问题也越来越棘手。那么并发问题的源头到底是什么原因呢?开胃汤喝完,要上第一道菜了。这也是接下来要的开味大菜之一。

你可能感兴趣的:(并发编程)