【Java进阶】深入理解并发

前言:

        对于操作系统的多任务,我们可以简单理解为在同一时刻运行多个程序的能力。就比如生活中我们用电脑可以一边操作QQ一边听着音乐一样。

        这里首先我们要先理解并行与并发的概念,与并行不同的是,并发的执行并不受CPU的数量所制约。操作系统将CPU的时间片给每个进程,让人有种并行处理的感觉。

        那么所谓的多线程实质上就是进程版的多任务状态,一个程序同时执行多个任务。我们可以把线程看作“轻量级的进程”。有了“轻量级”这个概念,我们就可以想象到创建或说销毁一个线程的开销要比进程小的多。

        其实细谈两者的区别。最主要的在于数据共享,在每个进程中都有自己的独立变量,而线程则共享数据。共享数据听起来似乎非常的危险,但也的确是这样。那么线程之间如何共享数据也就是说线程之间应该如何通信呢?当造成资源的竞争的时候如何解决呢?这里就涉及了同步或锁机制等相关的知识了,这些部分也是面试重灾区,这里暂时不展开来讲。

        说回线程,其实在实际应用中多线程也是十分有用的,就比如我们可以同时在QQ和不同的人聊天,一个Web服务器也可以同时处理几个并发的请求。

并发

        在没有并发之前,其实我们大部分都是采用顺序编程,也就是程序的所有任务都是在任意时刻都只能执行一个步骤。那么我们为什么需要并发编程呢?除了上面所说的并发可以处理多任务处理之外,其实还有一个非常重要的原因就是提高运行在单个处理器上的性能。

        其实这句话似乎有点违背了上面意愿,为什么这么说呢?试想一下对比于单线程,多线程并发执行不是增加了上下文切换的开销吗。这样来说的话,不应该反而并发是降低了处理器上的性能提升吗?

        其实我们不妨设想一下,当一个任务发生阻塞的时候,如果是单线程的话,这样就会导致后面的任务无法执行,最后导致的可能是整个程序上面的崩溃,而并发的话,在另外一个线程发生阻塞的时候,其他线程也在执行互不影响,其实从性能的角度看,如果没有任务阻塞,那么单处理机器上使用并发就没有任何意义。

        其实实现并发最直接的方式就是在操作系统级别使用进程了,但是上文讲了,每个进程都有自己的独立地址空间,两进程之间互不干涉。与此相反的是,Java这种这种并发系统会共享诸如内存和I/O这样的资源,因此编写多线程的困难其实在于协调不同的线程驱动的任务之间对资源的使用,使得这些任务不会同时被多个资源访问。

        在Java中的线程机制是抢占式的,这表示调度机制会周期性中断线程将上下文切换到另外一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。

猜你喜欢

转载自blog.csdn.net/weixin_43918614/article/details/123629494