提起多线程,相信也是很多程序员的短板之一,由于在平时开发过程中很少有机会写到多线程,所以也只是了解这个东西,顶多也是在背面试题的时候去了背背相关面试题,小编也是通过公司技术分享和自己平时面试遇到的一些问题作了一下整理。
首先了解一下并发和并行,并发是指在一个时间段内,两个或者多个线程在同一个cpu快速的切换执行程序,在宏观层面可以认为是同时进行,但是在微观层面还是单个的执行。并行是多个线程在不同的cpu上面同一时刻运行,是真正意义上的同时执行。
我们常常是并发三大特性,原子性、可见性和有序性。小编之前也是在面试过程中被问到,为什么要保证可见性,如果没有可见性会有什么问题?
这里就要说说线程到底是怎么操作我们的数据的,大家可以想一下,我们在多线程操作一个共享变量的是直接操作这个变量的吗?答案是否定的。其实每个线程操作的是共享变量的副本!,变量的值存在主存中,会为每个线程copy一个副本给他们操作,操作完成了再回显给主存修改掉主存的值,那么问题就来了,线程之间怎么知道另一个线程以及将之间副本的值修改完了并且回显给了主存呢。如果不知道那是否一个线程明明以及修改了值,结果另一个线程有给他改回去了呢?所以可见性就体现在这个地方,保证了可见性。常见的保证可见性可以用ReentrantLock、vloliate、synchronized这三个关键字或者类来保证可见性。
那么聊到线程就要聊到线程池,这也是面试高频问题。大家都知道线程池是管理线程的一个容器,他可以实现复用线程,可以更好的对线程进行调配和管理。那么线程在线程池中到底是怎么运作的呢?这里用一张图就可以很明了看出线程池的工作流程。
除此之外,线程池的七大核心参数这里就不一一介绍了,这也是面试高频题。
小编也只是今年刚毕业的萌新程序员一枚,写博客只是个人兴趣,以及想把自己了解到的知识记录下来,如果有大佬看到了欢迎指正呀。