java并发编程实战01--简介
来源:互联网 发布:网络电视如何看地方台 编辑:程序博客网 时间:2024/06/05 07:22
java并发编程实战01–简介
编写正确的程序很难,编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么为什么还要编写并发程序呢?线程是java语言中不可或缺的重要功能,他们能使简单的异步代码变得更加简单,从而极大简化复杂系统的开发。此外要想发挥多处理器系统的强大计算功能力,最简单的方式就是使用线程,随着处理器数量持续增长,如何高效的使用并发变得越来越重要。
线程的优势
发挥多处理器的强大能力
由于基本的调度单位是线程,因此如果在程序中只有一个线程,那么最多只能在一个处理器上运行。在双处理器系统上,单线程的程序使用一般的cpu资源,而在拥有100个处理器的系统上,将由99%的资源无法使用。显然多线程将大大提升程序的性能,提升系统的吞吐量(就好比在等待水烧开的同时看报纸,而不是等到水烧开后再看报纸)
建模的简单性
例如Servlet,是一个典型的多线程程序框架。框架负责解决一些细节问题,例如请求管理、创建线程、负载均衡、,并在正确的时候将请求分发给正确的应用程序组件。编写Servlet程序的程序员不需要了解有多少个请求在同一时刻被处理,也不需要了解套接字的输入流或输出流是否被阻塞。当调用Servlet的service方法来响应web请求时,看起来好像是以单线程的方式来响应请求。这种方式可以简化组件的开发,并缩短掌握这种框架的学习时间。
多线程带来的风险
多线程是把双刃剑,既有好的一面,也有坏的一面
安全性问题
线程安全问题是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,会产生奇怪的结果。
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
关键字之后,这个方法就是线程安全的方法,在同一时间只能被一个线程调用。性能问题
在设计良好的多线程应用程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度的运行时开销。在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另外一个线程时,就会频繁地出现上下文切换操作,这种操作将带来极大的开销;当线程共享数据时,必须使用同步机制,这种机制也是需要带来额外的内存和运算开销。之后的章节将详细介绍如何分析和减少这些开销。
- java并发编程实战01--简介
- 【Java并发编程实战】----- AQS(一):简介
- Java并发编程实战 笔记(一) 简介
- Java并发编程实战 AQS(一):简介
- 【Java并发编程实战】----- AQS(一):简介
- java并发编程实战-读书笔记-第1章 简介
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
- Java并发编程实战笔记(1)-线程安全简介
- Java并发编程实战
- Java并发编程实战--
- Java并发编程实战-
- Java 并发编程实战
- java并发编程实战
- Java并发编程实战
- Java并发编程实战
- Java并发编程实战
- Java并发编程实战
- Java并发编程实战
- Android学习笔记-数据存储-SharedPreferences和File
- 关于 RHEL WS/DT/SV 信息汇总
- HANA学习
- BlockingQueue的使用
- 关于负数的补码
- java并发编程实战01--简介
- Java的native方法
- 微软再度发力搜索业务:全力以赴挑战谷歌
- 酷秀网业务梳理
- php 配置 mcrypt模块
- web开发者推荐的最佳HTML5/CSS3代码生成器
- Android 下载线程的编写
- 基于SpringMVC Annotation配置的HelloWorld
- 谷歌再出手 将三字母域名abc.biz收至麾