java并发编程实战01--简介

来源:互联网 发布:网络电视如何看地方台 编辑:程序博客网 时间:2024/06/05 07:22

java并发编程实战01–简介

编写正确的程序很难,编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么为什么还要编写并发程序呢?线程是java语言中不可或缺的重要功能,他们能使简单的异步代码变得更加简单,从而极大简化复杂系统的开发。此外要想发挥多处理器系统的强大计算功能力,最简单的方式就是使用线程,随着处理器数量持续增长,如何高效的使用并发变得越来越重要。

线程的优势

  1. 发挥多处理器的强大能力

    由于基本的调度单位是线程,因此如果在程序中只有一个线程,那么最多只能在一个处理器上运行。在双处理器系统上,单线程的程序使用一般的cpu资源,而在拥有100个处理器的系统上,将由99%的资源无法使用。显然多线程将大大提升程序的性能,提升系统的吞吐量(就好比在等待水烧开的同时看报纸,而不是等到水烧开后再看报纸)

  2. 建模的简单性

    例如Servlet,是一个典型的多线程程序框架。框架负责解决一些细节问题,例如请求管理、创建线程、负载均衡、,并在正确的时候将请求分发给正确的应用程序组件。编写Servlet程序的程序员不需要了解有多少个请求在同一时刻被处理,也不需要了解套接字的输入流或输出流是否被阻塞。当调用Servlet的service方法来响应web请求时,看起来好像是以单线程的方式来响应请求。这种方式可以简化组件的开发,并缩短掌握这种框架的学习时间。

多线程带来的风险

多线程是把双刃剑,既有好的一面,也有坏的一面

  1. 安全性问题

    线程安全问题是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,会产生奇怪的结果。

    public class UnsafeSequence{    private int value;    public int getValue(){        return value++;    }}

    这段代码的本意是每当getValue()方法被调用一次,value的值就加1,可是如果当两个线程同时进入getValue()方法,这两个线程看到的value的值都是一样的,于是在value++之后这两个线程获取的value是一样的值,这明显有悖于设计初衷。要想程序正常运行,就必须保证getValue()方法或者value属性只能同时被一个线程调用,这就是同步机制。以下代码将解决这个问题。

    public class UnsafeSequence{    private int value;    public synchronized int getValue(){        return value++;    }}

    给方法加上synchronized关键字之后,这个方法就是线程安全的方法,在同一时间只能被一个线程调用。

  2. 性能问题

    在设计良好的多线程应用程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度的运行时开销。在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另外一个线程时,就会频繁地出现上下文切换操作,这种操作将带来极大的开销;当线程共享数据时,必须使用同步机制,这种机制也是需要带来额外的内存和运算开销。之后的章节将详细介绍如何分析和减少这些开销。

1 0