漫谈并发编程(一) - 并发简单介绍

并发编程是每一个程序猿进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么easy。我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想。并发编程的思想是通的,可是样例得要是具现的,在该系列中将使用java语言用以演示。

此文作为为漫谈并发编程系列的第一篇,探本溯源,以一篇对并发的文字描写叙述开头。

并发编程由来

早年的计算机中没有操作系统,在某个时间段内仅仅支持运行一个程序,而且这个程序能訪问计算机的全部资源。在这个程序全然运行完后,再运行下一个程序。

在此时,引入并发编程的优点:

  • 高效性:计算机的各个部件不用忙等,比如一个程序在使用IO的时候,CPU能够给另外一个程序使用。这样便提高了设备的使用率。
  • 公平性:计算机上运行的程序应该一视同仁,而不是某一个先运行完后,再让另外一个程序開始运行。
  • 便利性:在计算多个任务时,应该编写多个程序,必要时,让其互相通信,这比让一个程序来实现多个任务要更easy实现。

并发编程最早的体现是多进程的并发编程,这是由操作系统的出现而引入的。多进程的并发编程攻克了进程独占计算机所有设备的问题,提升了计算机的吞吐量。能够想象在这样的情况下随意时刻的计算机设备与正在执行的进程的相应关系的是一对一,如图所看到的:。假设当前执行进程较少,系统的非常多设备依旧会处于空暇状态,此时,使用线程能够进一步提高计算机的处理效率,线程同意一个进程中有多个程序控制流,那么一个进程的多个线程就能同一时候执行在多个设备上,如图所看到的:,所以使用线程能进一步提升系统的吞吐量及处理效率。而如今,随着摩尔定律的实现重任逐渐由单cpu的性能添加转移到cpu数量的添加,怎样提高多cpu的资源利用率变得非常重要,这些原因促使线程的并发编程越发重要。(从以上分析来看,要从底层提升多线程程序的性能能够使多个线程能够同一时候执行在多个设备上。)

建模的简单性

线程除了可以提升性能,还可以将复杂而且异步的工作流进一步分解为一组简单而且同步的工作流,每一个工作流在一个单独的线程中执行,并在特定的同步位置进行交互。这一条实际影响了多线程技术的使用场景,即通常将逻辑上或物理上独立的任务用多线程技术来实现(如计算任务与IO任务),而非在程序里相互交错。

线程带来的风险

  • 安全性问题:在非常多时候,线程间并非全然独立的,而是相互协作去共同完毕一个task,因此可能须要共同的去訪问一个或多个资源,当线程之间没有正确的进行协作时,可能会导致单个资源混乱或者多个资源间存在数据一致性的问题。
  • 活跃性问题:有时往往须要控制多个线程的运行顺序,比如一个线程去读IO,还有一个线程从上一个线程中取,因此我们须要将线程进行同步的控制。线程间的协作,easy导致死锁、饥饿等问题。由此线程就会变得不"活跃"。
  • 性能问题:频繁的线程切换、同步机制(常常抑制编译器优化,使内存缓存区的数据无效)。在这里提出一个问题:线程是能够运行一些复合操作的,在使用方式上与进程差异不大,为什么我们不在线程的基础上进一步的细分,比方搞出一个比线程更细的调度单位"小线程",这种话程序的运行效率不会更高吗?答:这样会进一步添加程序控制流的数量,会导致更加频繁的线程切换,事实上划分到线程这一层也许就是最好的折中了。

无所不在的线程

使用多线程的场景

最常见的须要编写多线程程序的场景是:1. 有多个逻辑或者物理的任务须要运行,用多个线程将其区分,而非在一个线程中完毕全部工作,在这里使用多线程的主要优点是使程序结构更加清晰、并简化了编程。2. 将一个任务拆分成多个较小的任务,或者将一个任务分为几部分,交给多个线程运行,比方计算任务,此时使用多线程的主要目的就是提升性能了。

须要编写线程安全代码的场景

除了主动编写多线程程序来"攻",我们还常常须要"防"多线程,防止多线程带来的一些衍生危害。

  • Timer:我们自己写的定时任务,Timer管理的线程会调用。而其它线程也非常有可能,因此,在这要注意线程安全。
  • Servlet和JSP:通常我们的Servlet和JSP会被多个线程同一时候所调用,webserver会为每个到来的http请求都从线程池中分配一个线程给它。因此在Servlet和JSP中我们须要保证线程安全,同理,在ServletContext和HttpSession等容器中保存的Servlet过滤器和对象,都必须是线程安全的。
  • 远程方法调用(RMI):在RMI中,存在被多个线程重入的可能,所以必须确保它们自身的线程安全性。
时间: 2024-12-15 07:12:34

漫谈并发编程(一) - 并发简单介绍的相关文章

Java并发编程:并发容器ConcurrentHashMap

Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低.因此Java5.0开 始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入

Java并发编程:并发容器之ConcurrentHashMap(转)

本文转自:http://www.cnblogs.com/dolphin0520/p/3932905.html Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程

【转】Java并发编程:并发容器之ConcurrentHashMap

JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低.因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包.与Vector和Hashtable.Collections.synchronizedXxx()同步容器等相比,util.conc

Java并发编程:并发容器之CopyOnWriteArrayList(转)

本文转自:http://www.cnblogs.com/dolphin0520/p/3938914.html Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.从J

【Java并发编程】并发编程大合集-值得收藏

http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Ja

【Java并发编程】并发编程大合集

转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Java并发编程]Volatile关键字(上)

漫谈并发编程(一) - 并发简介

并发编程是每个程序员进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么容易.我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想.并发编程的思想是通的,但是例子得要是具现的,在该系列中将使用java语言用以演示. 此文作为为漫谈并发编程系列的第一篇,由于本人喜欢先论理再论事,而非先论事再论理,所以就以一篇对并发的文字描述开头了. 并发编程由来 早年的计算机中没有操作系统,在某个时间段内只支持运行一个程序,并且这个程序能访问计算机的所有资源.在这个程序完全执行完后,再执行下一个程

掌握系列之并发编程-1.并发基础

掌握高并发.高可用架构 第二课 并发编程 从本课开始学习并发编程的内容.主要介绍并发编程的基础知识.锁.内存模型.线程池.各种并发容器的使用. 第一节 并发基础 并发编程 并发基础 进程 线程 线程通信 系统.包括操作系统的运行是以CPU为核心的,各种数据操作都是在CPU中进行的.所以要学习并发编程,必须要搞清楚和CPU的关系. CPU简介 经常说CPU是4核8线程的,这个的意思是4个物理核心,每个物理核心虚拟出2个虚拟核心,也就是8个虚拟核心 .每个虚拟核心在一个时刻只能运行一个线程. 进程和

【并发编程】并发编程中你需要知道的基础概念

本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 多线程是Java编程中一块非常重要的内容,其中涉及到很多概念.这些概念我们平时经常挂在嘴上,但是真的要让你介绍下这些概念,你可能还真的讲不清楚.这篇博客就总结下多线程编程中经常用到的概念,理解这些概念能帮助我们更好地掌握多线程编程. 进程(Process)与线程(Thread) 进程和线程是最常提到的概念了.在linux中,线程与进程最大的区别就是是否共