并发
在学习并发之前,学到的都是有关顺序编程的知识, 即程序中的所有事物在任意时刻都只能执行一个步骤。
- 并行编程可以使程序执行速度得到极大提高 并行:“具有可论证的确定性, 但是实际上具有不可确定性”
- 不可避免的多线程问题 。 例: java Web 系统是最常用的java应用系统之一,而基本的Web库类。servlet具有天生的多线程性。
- java是一种多线程语言 学习并发是面向高级特性的一种飞跃。
并发的多面性
并发编程令人困惑的一个主要原因是: 使用并发时需要解决的问题有多个 ,而实现并发的方式也有很多种。
使用并发解决问题的大体可以分为‘ 速度’ 和 ‘ 设计可管理性’ 两种
- 更快的执行。
如果你想要一个程序运行起来更快 ,那么可以将其断开位多个片段,在单独的处理器上运行每个片段。这听起来很简单。。。
并发是用于多个处理器编程的基本工具,为了使程序运行更快你必须学会使用这些额外的处理器。
处理方式
1.1 在处理器之间分布多个任务 从而极大的提高吞吐量(多处理器web服务器的常见情况)
1.2 为每个请求分配一个线程 可以将大量用户请求分布到多个cpu上。
但是。并发通常是提高运行在单处理器上的程序的性能。
需要理解并发和并行 。
并发是 多线程但是在同一处理器
并行是 多线程但是在多个处理器
直观的来看 并发似乎确实比顺序编程要开销更大。因为其中多包涵了 所谓上下文切换的代价
但是使得这个问题变得不同的是 ‘阻塞’ 。例如调用 (I/O)
从性能的角度来说 , 如果没有任务会阻塞,那么在单处理器机器上使用并发就没有任何意义了
某些编程语言被设计问可以将并发任务彼此隔离, 这些语言通常被称为函数型语言。
java采取更加传统的方式, 在顺序型语言的基础上提供对线程的支持。
- 改进代码的设计
在单cpu机器上使用多任务的程序在任意时刻仍旧只在执行一项工作, 因此从理论上讲,肯定可以不要任何任务来编写相同的程序,但是,并发提供了一个重要的组织结构的好处;例如仿真
使用协作式线程。
基本的线程机制
并发编程可以让我们将程序划分为多个分离的,独立运行的任务。通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动。
定义任务
线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要定义任务,只需要实现run()方法,使得该任务可以执行你的命令。