内容简介:关于Java并发的理论知识
并发理论
实际上,从性能角度来考虑,如果没有线程阻塞,那么在单处理器机器上使用并发就没有任何意义。
这是一篇关于并发编程的学习笔记。
并发的多面性
并发编程令人困扰的一个主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多种,并且在这两者之间没有明显的映射关系(而且通常只具有模糊的界限)。
用并发解决的问题大体上可以分为“速度”,“设计可管理性”两种。
如何更快的执行
并发是多处理器编程的基本工具。 如果你有一台多处理器的机器,那么就可以在这些处理器之间分布多个任务,从而可以极大地提高吞吐量。这是使用多处理器Web服务器的常见情况,在为每个请求分配一个线程的程序中,它可以将大量的用户请求分布到多个CPU上。
但是,并发通常是提高运行在单处理器上的程序的性能。
这听起来很矛盾,因为并发程序开销比该程序的所有部分都顺序执行的开销大,因为其中增加了上下文切换的代价(一个任务转换到另一个任务)。表面上看,将程序的所有部分当作单个的任务运行开销似乎是少了很多,而且可以节省上下文切换的开销。
但是,你是否考虑到阻塞?如果程序在某个任务中因为该程序控制范围之外的某些条件(比如IO)而导致不能继续执行,那么我们就会认为这个任务或程序阻塞了。但是,如果通过并发编程,其他任务还可以继续执行。实际上,从性能角度来考虑,如果没有线程阻塞,那么在单处理器机器上使用并发就没有任何意义。
实现并发最直接的方式就是在操作系统级别使用进程。进程是运行在它自己的地址空间内的自包容程序。多任务操作系统可以通过周期性地将CPU从一个进程转换到另一个进程(相当于CPU上有一个指针,周期性地停在每个进程上,指向哪个进程,哪个进程就会运行,而其他进程进入休眠状态)。
进程总是很吸引人的,因为操作系统通常会将进程互相隔离,因此他们不会彼此干涉,这使得用进程编程相对简单很多。
与此相反的是,Java所使用的这种并发系统会共享诸如内存和I/O这样的资源,因此编写多线程程序最基本的困难在于在协调不同线程驱动的任务之间的这些资源的使用,使这些资源不会同时被多个任务访问。
Java是如何处理并发的?
Java采取了更加传统的方式,在顺序型语言的基础上提供对线程的支持。 线程机制是在由执行程序表示的单一进程中创建任务。这种方式产生的一个好处是操作操作系统的透明性。
Java vs 多处理器
由于 Java 并发编程操作的是线程,所以很多人会认为Java程序跑在JVM上是作为一个进程执行的,这是没有问题的。
所以有人认为Java程序只能在单个CPU上跑,因为处理器的调度单位是进程?这句话就是有问题的了,因为现在的操作系统,线程是由内核管理的,调度单位是线程而非进程,也就是说一个Java程序可以在多个CPU中同时运行。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 简单易懂------强化学习理论与实战(一)
- 机器学习中的凸优化理论
- 【白话机器学习】算法理论+实战之K近邻算法
- 给普通人看的机器学习(一):优化理论
- 关于深度学习你必须知道的几个信息理论概念
- 机器学习决策树算法实战:理论 + 详细的 Python 3 代码实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
随机密码生成器
多种字符组合密码
Base64 编码/解码
Base64 编码/解码