聊聊Java的多线程 关注 共
2522字,需浏览
6分钟
·
2021-12-18 17:29
大家好,我是庆哥 ,今天来和大家聊聊Java多线程! 多线程这个东西非常的重要,属于 Java的核心知识 ,也是面试必备的,其中的 JUC更是一个初级程序员迈向中高级程序员的必经之路
,那你有没有想过为什么多线程的地位如此之重, 是什么原因导致了多线程变得越来越重要了呢? 那就要聊聊 摩尔定律 了,什么是摩尔定律,这个不是咱们化学上的那个概念,这里的摩尔定律是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。 当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。 换言之, 同样的钱所能买到的电脑性能,将每隔18-24个月翻一倍以上。
这一定律揭示了信息技术进步的速度。但是你应该知道,这个现象不可能一只保持下去的…… 所以从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。也就是说摩尔定律失效了! 什么是CPU主频 ,简单理解就是 主频越大,CPU性能也就越强
,根据摩尔定律来说,可以通过增加晶体管数量提升主频,从而提升CPU性能, 但是当增加到一定数量就不能继续通过增加的方式去提升性能了 ,可能继续增加则会产生相反的作用,也就是摩尔定律失效了 这里有一个 理解的关键点 就是,我们说的这个摩尔定律其实就是 从硬件上去提升性能 ,但是 在硬件上的提升可能刚开始的效果非常显著,但是越到最后就会发现,单靠提升硬件似乎到了瓶颈,依靠硬件提升的性能微乎其微 ,所以就得想其他办法提升性能了! 那现在问题就来了,在主频不再提高且核数在不断增加的情况下,要想 让程序更快 就要用到 并行或并发编程 。 也就是说, 多线程之所以变得越来越重要,是跟技术的发展离不开的 ,是时代所趋, 单靠硬件上的提升,效果变得越来越不明显了 ,所以就需要多线程来弥补这一差距,以前是一个人干活,现在10个人来干活,那肯定效率更高,所以多线程自然地位陡升! 另外在软件方面这块,就是在现有的高并发系统中,常常需要一些异步+回调的操作,这样的需求就需要多线程来完成,这也是导致多线程变得越来越重要的一个原因! 多线程可以说是你必备的一个高级知识,掌握好以后,可以让你碾压60%以上的Java程序员,而且对你的面试极有帮助! 理解进程和线程 一个进程中包含多个线程,一个进程就相当于一个应用程序(就咱们平常安装的一些软件,比如qq,诶微信等等),一个应用程序底层就是 cpu 来运行的,比如我们的电脑同时打开了多个应用,表面看来像是在同时运行,实际上在同一时间只运行了一个应用程序,只不过 cpu 的运行速度非常快,会进行高速切换,让我们觉得是在同时进行。 最经典的一个例子就是迅雷了 ,我们电脑打开迅雷相当于开了一个进程,当我们使用迅雷下载东西的时候,比如说,下载两部电影,那么在迅雷中就存在两个不同的执行路径,也就是有两个线程在同时做下载这么个动作,也就是同时在执行两个任务! 所以, 进程包含线程,相当于一个进程下所有线程的集合
。 一个线程就是一个执行路径。 比如我们常写的Java代码中的main方法所在的线程就是一个 主线程 ,我们创建的线程叫做 子线程 , 如果说一个项目中肯定有一个线程,那么这个线程就是主线程了。 对于这个问题, 到底该怎么理解或者说区分线程和进程的概念
,再 举一个非常贴切的例子 ,我们大多数人都用过QQ吧,我们打开一个QQ,其实就是开启了一个进程, 然后我们发送一段文字,那就是开启了一个线程,我们再发送一天语音,那就是又开启了一个线程,那么在这个QQ的进程中就有发文字和语言两个线程了,当然,可能还有其他的线程! 用户线程和守护线程 main主线程( 用户线程 )
后台gc线程( 守护线程 )
那 什么是用户线程 呢?我们的main线程就是用户线程,这个是系统的工作线程,它会执行你线程当中设置的业务逻辑! 那 什么是守护线程呢 ?对于我们熟知的gc(垃圾回收)线程就是一个守护线程,它跟用户线程有个最主要的区别就是 守护线程是不能单独存在的 ,是在后台默默执行的, 随着一个用户线程而生,当所依附的用户线程挂掉之后,这个守护线程也就不存在了。 再强调一点, 守护线程不能单独存在 ,如果所有的用户线程都执行完毕了,那么不管是否还有守护线程在执行任务,jvm都会退出,程序则会停止! 这里的顺序是不能乱的,也就是设置守护线程要在start之前! 什么是管程 这里大家需要了解下 什么是管程? 可能大家对这个概念不是很熟悉,都听说过什么线程啊,进程的,但是管程是什么东西? 管程其实就是 Monitor
,这是啥玩意,翻译过来其实就是 监视器
的意思, 说白了,这玩意就是我们平常所说的 锁 , 多线程加锁 ,知道了吧! 再说的官方点,这个 Monitor是一种同步机制 ,什么意思嘞? 就是它可以 保证在同一个时间内只能有一个线程去访问被保护的数据和代码 ,你看这不就是锁吗?我们加锁的目的不也就是为了保证数据安全,通常情况下不也就是保证只有一个线程可以去操作业务逻辑嘛,对吧, 所以这个叫做Monitor的监视器就是锁 ! 我们再深入点分析,在我们的java虚拟机中,它的同步就是基于这个Monitor管程对象实现的, 我们的java对象其实都会伴生一个Monitor对象 ,又因为同步机制就是由这个Monitor实现的,所以在我们的Java中,每一个java对象的创建和销毁都会伴随着一个Monitor对象的创建和销毁,因此, 我们的每一个Java对象天生就是一把锁! 而这个Monitor的底层是由C++来实现的,我们不需要关注这个Monitor,而是注重于我们的Java对象,看个代码: 这段代码中,我们就把Object对象作为一把锁使用,记住,任何一个Java对象都可以作为一把锁使用!
浏览
24 点赞
评论
收藏
分享
手机扫一扫分享
分享
举报
点赞
评论
收藏
分享
手机扫一扫分享
分享
举报