聊聊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的进程中就有发文字和语言两个线程了,当然,可能还有其他的线程!

用户线程和守护线程


先看一段代码:
上述代码一旦执行一定会存在两个线程:
  1. main主线程(用户线程

  1. 后台gc线程(守护线程

什么是用户线程呢?我们的main线程就是用户线程,这个是系统的工作线程,它会执行你线程当中设置的业务逻辑!

什么是守护线程呢?对于我们熟知的gc(垃圾回收)线程就是一个守护线程,它跟用户线程有个最主要的区别就是守护线程是不能单独存在的,是在后台默默执行的,随着一个用户线程而生,当所依附的用户线程挂掉之后,这个守护线程也就不存在了。
对于线程可以通过以下设置是用户线程还是守护线程:

再强调一点,守护线程不能单独存在,如果所有的用户线程都执行完毕了,那么不管是否还有守护线程在执行任务,jvm都会退出,程序则会停止!
另外还有一个知识点需要注意,就是这里:
这里的顺序是不能乱的,也就是设置守护线程要在start之前!

什么是管程


这里大家需要了解下什么是管程?可能大家对这个概念不是很熟悉,都听说过什么线程啊,进程的,但是管程是什么东西?
管程其实就是Monitor,这是啥玩意,翻译过来其实就是监视器的意思,说白了,这玩意就是我们平常所说的多线程加锁,知道了吧!
再说的官方点,这个Monitor是一种同步机制,什么意思嘞?

就是它可以保证在同一个时间内只能有一个线程去访问被保护的数据和代码,你看这不就是锁吗?我们加锁的目的不也就是为了保证数据安全,通常情况下不也就是保证只有一个线程可以去操作业务逻辑嘛,对吧,所以这个叫做Monitor的监视器就是锁
我们再深入点分析,在我们的java虚拟机中,它的同步就是基于这个Monitor管程对象实现的,我们的java对象其实都会伴生一个Monitor对象,又因为同步机制就是由这个Monitor实现的,所以在我们的Java中,每一个java对象的创建和销毁都会伴随着一个Monitor对象的创建和销毁,因此,我们的每一个Java对象天生就是一把锁!
而这个Monitor的底层是由C++来实现的,我们不需要关注这个Monitor,而是注重于我们的Java对象,看个代码:
这段代码中,我们就把Object对象作为一把锁使用,记住,任何一个Java对象都可以作为一把锁使用!
浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报