01-你真的了解并发吗

01-你真的了解并发吗

我把并发分为四个阶段:

第一个阶段是,熟练掌握并发相关的API,能够完成基本的并发编程;也就是我们所熟悉的继承Thread也好,实现Rannable接口也好,使用各种的锁,根号中期,注册队列,等等,你要熟练掌握这些和并发相关的API,这是第一个阶段。

我们会用这些API还不行,我们要掌握这些API实现的原理,所以,第二个阶段是,熟读API源码,掌握其原理;了解了这些原理之后,对我们来说,无论是深入理解并发也好,或者说以后我们的编程也好,都是有非常大的帮助的,这是第二个阶段。

Java的运行是基于JVM的,那么,JVM是如何解读多线程的呢?如何解读我们的并发代码呢?这就需要我们深入理解Java虚拟机的内存模型,以及Java虚拟机执行多线程的执行引擎,等等,就是,关于虚拟机相关的对线程的一些支持,这就深入到了Java虚拟机的层次,这就是第三个阶段。

Java虚拟机是运行在操作系统上的,第四个阶段就是,操作系统对并发的支持。

这是学习并发的四个阶段。

我们知道了并发学习的四个阶段,那么,我们为什么要学习并发?

我们有没有见过并发的场景呢?其实并发是无处不在的,比如,淘宝的双十一,就是一个非常高的并发量,就是很多人同时去访问一个网站,而这个网站却能够支撑大量的并发访问,这就是一个并发的场景,细致的说,web容器、数据库服务器,等等各类的服务器软件,都是支持并发的,那么,并发的性能就直接的影响到软件的性能,所以,并发编程在整个并发应用的场景下是非常关键的,除了我们刚刚说的各种服务应用之外,那么,还有没有其他的地方用到并发呢?其实也是非常多的,刚刚说的是服务端,那,我们说个客户端,eclipse就是一个客户端应用,它也有大量的并发场景,比如说,我们在编辑代码的时候,它可以做很多的事情,比如说,可以同时运行一个web服务,也可以做很多的事情,比如说它在进行编译,等等,总之它会做很多的事情,甚至可以说到底层的垃圾回收,所以,任何一个我们可以说Java应用都是多线程的,也都是处于并发的,关于多线程和并发,我们后面会详细的了解。也就是说,并发场景在我们的生活中是无时无刻不在发生的,所以,我们要学习并发编程。那么,我们为什么会在生活中遇到这么多的并发?这个也是非常好理解的,源于并发的优点,那么,并发有哪些优点呢?现在硬件越来越便宜,那么,我们就可以通过增加硬件的方式,干嘛呢?我们想提高一个性能,就可以使用多核CPU,使用并发可以发挥出多核处理器的强大的能力,当然了,也不仅仅是多核,我们可以直接说多处理器,能够发挥多个处理器的强大的运算能力,除了发挥多核处理器的强大能力之外,能够让我们的建模更加的简单,就是所谓的建模的简单性。

第三个是异步事件的简化处理;第四个就是响应更加灵敏的用户界面;

这些是并发编程的一些优点,当然,它的好处远比这些要多的多,这里仅仅是相当于给大家举了几个例子,

建模的简单性怎么理解呢?java是一个面向对象的编程语言,我们编程的目的其实就是模拟现实客观世界的一些东西,那么,这也就是所谓的建模,我们的生活中是无时无刻不体现着多个线程的,我在说话的时候,我同时也在移动鼠标,这就是一个并发的情景,那么,我不可能当我鼠标移动的时候我不说话,当我说话的时候鼠标不能移动,这显然是一个非常困难的事情,那么,生活中无时无刻不面临着大量的并发,我们程序在建模的过程中,

同样也需要大量的并发,如果我们不使用并发,那么,建模就会导致非常的繁琐,有了并发,就可以让我们的建模更加简单化。

第3个跟第2个说的基本上是同一个道理,异步事件的简化处理,比如说,我们看Windows就知道了,Windows里面有一个类似的计划任务,

在这里面我们去创建一个计划任务之后,

它就可以在指定的时间,或者指定的事件上去执行某个事件,

比如我们想定时打开一个我们的web应用,或者说我们定时的开启一个数据库服务,等等,那么,我们可以去做任何的事情,而,等到时间到了这个触发点的时候,它就可以触发这个事件去执行这个事件,那么,这就是一个所谓的异步事件,异步事件的简化处理。第四个就是响应更加灵敏的用户界面,这个我们做java开发的朋友肯定是大有体会的,就拿eclipse来说的话,我们在编写代码的过程中,比如说,我们就写一个web应用,那么,我们在进行web开发的时候,肯定是边编写边调试的一个过程,那么,我们可能就会运行一个web服务器,比方说Tomcat,我们知道,eclipse是集成Tomcat的,因此就是说,如果单线程执行的话,那么,当我们运行web服务器的时候,我们就没有办法同时写代码了,当我们写代码的时候,我们就没有办法同时运行web服务器,那么,这样显然是不好的。当然了,我们也可以通过java自带的分析工具来看一下,eclipse到底给我们运行了多少个线程,通过jconsole这个命令,

我们知道,JDK中给我们自带了很多的非常好用的监控工具,我们就可以通过这些工具来进行监控我们的Java应用,如果大家对Java的这些监控工具比较感兴趣的话,可以参考我之间的“深入理解Java虚拟机”这个课程,这里面就非常详细的讲解了Java虚拟机的一些工具。

我们看到,这就是jconsole,

我们在这里可以选择我们的本地进程,

这个地方其实eclipse没有显示出来它的名字,我们知道,它就是我们所要看到的,点进去就可以了

可以看到有对内存的监控,对线程的监控等等,我们就来看对线程的监控

我们发现目前有41个线程在执行。也就是说,我们看似表面平静的eclipse,其实,目前它有41个后台线程在不停的在运行着

所以,就是说,我们通过多线程可以响应更加灵敏的用户界面,就是说,如果我们只有单个线程的话,那么

在执行我们这里所看到的第一个线程的时候,就没有办法再同时执行后面的线程了,那么,我们在运行

这么一个操作(创建一个工程)的时候,那么,我们就需要等待其他的线程执行完毕了之后才能够执行,也就是没有所谓的线程了,就是,等待其他的任务执行完毕了我们再来执行这个,那么,可以说是相当相当痛苦的一件事。

这就是并发的优势。

那么,既然并发这么强大了,那么,我们学习并发又有哪些好处呢?这个问题也是非常好解释的,我们知道并发的功能非常的强大,用的场景也非常的多,那么,对于我们找工作,面试就非常的的新入手了;我们之前也提到了,我们要熟读并发的API源码,掌握并发的原理,掌握了并发的原理之后,肯定就了解了并发变成的原理,提高代码的编写能力,了解了原理之后,那么,排除问题就很容易了,解决工作中遇到的并发问题,也就是并发的一些缺点。其实,人都是有目标的有信仰的,我们做java开发,从技术角度来讲,我们都希望自己能够成长为一名系统架构师,那么,从java的开发者到系统架构师,那么,可以说,并发这一块是必须要经历的过程,所以,通过我们的学习,可以帮助你更块的达到你成为系统架构师的目标。

说完这么多好处了,那么,并发有没有缺点呢?当然也是有的,我们就简单的列举一下,当然,并发的缺点也并非是无可避免的,都是可以通过一些手段一些方法来尽可能的避免并发中的缺点。

首先,并发肯定是有安全性问题。后面有很长的一段时间我们会不断的提及安全性问题,我们知道线程安全性问题是线程的一个非常大的一个问题。第二个是活跃性问题。这个可能很多朋友没有听说过,这个后面也会给大家详细的去说明,这里仅仅是给大家列出来这么一回事,那么,简单的来说,什么叫活跃性问题呢?活跃性与之对应的就是不活跃,不活跃就是不执行,那么,多个线程在执行的过程中,我们知道,它是去抢占CPU的,那么,画个图,

比如这是打菜的窗口,全学校有很多人都来买菜,这是一个秩序非常混乱的学校,谁能够抢到谁就去买

更有些素质不高的人,他买到了之后,他也不走,所以就导致了,不停的有人在去抢,不停的有人再去往这个窗口上抢,那么,谁抢到谁就买菜,买完菜他不走,接着再去抢,因此,这就很有可能会导致一个问题,一个什么问题呢?可能就有这么几个学生,他就是始终抢不到,买不上菜,于是就导致了一个问题,就是所谓的饥饿问题,这也是线程中的一个术语一个概念叫做饥饿,那么,处于饥饿状态他就不活跃,这就是一个活跃性问题,当然了,除了饥饿以外,还有我们所熟悉的,像死锁,等等,都是活跃性问题的一个典型的问题。

第三个就是性能问题,其实我们列出来的并发的缺点也好,优点也好,在我们后面的内容中都会详细的了解这些东西,性能问题我们这里先不说,其实,就是我们后面所要讨论的“线程一定快吗?”其实作为有经验的开发人员来讲,心里面是非常清楚的,线程不一定快,为什么?因为线程之间切换也是有一定的性能开销的。

本套课程所要讲解的思路:我们举个例子,我们以线程安全性问题来说明,我们授课的思路,比如说要讲线程安全性问题,那么,首先我们就要先来创建线程,那么,创建线程的多种方式,然后,每一种方式有哪些优缺点,我们要经常使用哪种方式呀等等,然后,创建完这个线程之后,我们开始模拟多线程运行,然后我们可能会举一个例子,比如说,多个窗口卖票,也是一个非常经典的例子,然后,卖票肯定会遇到一个问题,就是所谓的线程安全性问题的引入,引入完之后,我们要解决,提出解决方案,比如这里提出来一种方法,我们可以使用synchronized来进行解决,然后下面就是解决线程安全性问题,在提出解决方案中,我们可能会提出来非常多的方案,使用多种解决方案来解决线程安全性问题,接着我们就需要了解如何解决的,解决的原因,比如,我们要了解synchronized的原理,synchronized的原理我们可能就要深入到Java虚拟机的层面来进行了解,因此,可能我们在往下了解其他的,如果我们有源码的话,我们先了解它的源码,然后接着在走Java虚拟机的层面,就直接看Java虚拟机的指令,然后分析它的执行,也就是说,可以非常显然的看出来,我们是由浅入深,

因此我们后面,也会说到这个问题,就是适合的人群。

猜你喜欢

转载自blog.csdn.net/G_66_hero/article/details/85078505