Java并发编程实战_[Java并发编程实战] 简介
并发简史
在早期不包含操作系统的计算机中,程序都是单一的串行程序,从头至尾只能执行一个程序,并且这个程序访问这个计算机的所有资源。然而,随着技术的发展,操作系统出现了。它使得计算机程序有了进程,线程的概念,每次可以运行多个程序,并且不同的程序都在单独的进程中运行。操作系统为各个独立执行的进程分配各种资源,包括内存,文件句柄,安全证书等。不同进程之间通过系统本身的通信机制来交换数据,如:套接字,信号处理器,共享内存,信号量以及文件等。
操作系统支持多个程序同时执行,原因主要有:资源利用率。如某个程序在等待一个耗时操作完成,那么在等待的同时可以运行另外一个程序,这样可以提高资源利用率。
公平性。如通过时间片的方式让程序轮流占用计算机资源,而不是由一个程序从头至尾运行完,再进行下一个。
便利性。编写多个程序来计算多个任务,必要时进行通信。比只编写一个程序来计算所有任务更加容易实现。
串行编程模型优势在于直观性和简单性,每次只做一件事直至完成,然后再做另外一件。然而很多情况下,这个串行模型并不理想。打个比方,我们想烧水泡茶然后看书,以串行的工作方式,我们必须等到水烧开了把茶泡好,才能去看书。而现实生活中,完全可以烧水的过程先去看书,然后等待水烧开在去泡茶。这也引出了计算机应用程序用,同步和异步的概念。正是这些原因,促使进程,线程的出现。
线程,也被称为轻量级进程。现在大多数操作系统中,都是以线程为基本的调度单位,而不是进程。一个进程可以创建多个线程,并且这些线程会共享进程范围内的资源。所以,多个线程如果没有明确的协同机制,那么他们是独立运行的。同样,这些线程都可以访问进程的变量,如果没有明确的同步机制来协同对共享数据的访问,那么当一个线程正在使用某个变量时,另外一个线程可能同时访问这个变量,造成不可预测的结果。但是,每个线程都有各自的计数器,栈以及局部变量等。
线程的优势
如果使用得当,可以降低开发,维护成本,提升性能。线程还可以降低代码复杂度,使得代码更容易编写,阅读和维护。在GUI 程序中,可以提高界面的响应速度;在服务端程序中,可以提升资源利用率和吞吐率。发挥多核处理器的强大能力。
建模的简单性。将复杂且异步的工作流分解到各个线程运行,在特定的同步位置进行交互。
异步事件的简化处理。某个线程的阻塞不影响其他线程的处理。
响应更灵敏的用户界面。使用特定线程来处理耗时操作,而不是放在UI主线程中处理。比如 Android App 耗时事件不能在 UI 线程处理,会影响 UI 响应的流畅度。
线程的风险
Java 对线程的使用是一把双刃剑。线程的优势我们都已经知道,前提是我们能够正确的编写出安全的并发代码。然而,由于开发人员的技术不足,并发潜在风险的不易察觉,都有可能让我们的程序达不到预期的效果。所以,我们有必要了解一下并发风险这一方面的内容。
安全性问题
多个线程的执行顺序,在没有同步的情况下是不可预测的,甚至产生奇怪的结果。如下面这个序列生成类,多个线程同时获取到的值可能是相同的。public class UnsafeSequene{
private int value;
//返回一个唯一的数值
public int getNext(){
return value++;
递增操作 value++,实际上他包含三个独立的操作:读取 value 的值
将 value 加 1
将计算结果写入 value
由于多个线程之间的操作交替执行,所以可能发生两个线程读到相同的值。如下图所示的 A 线程和 B 线程:
这里写图片描述
上图说明的是一种常见的并发安全问题,称为竞态条件(Race Condition)。由于多个线程共享相同的内存地址空间,并且是并发运行,因此可能会访问或修改其他线程正在使用的变量。这种方式比其他线程间通信机制更容易实现数据共享,但他同样也带来了巨大的风险:线程由于无法预料数据的变化而发生错误。
幸运的是,Java 提供了各种同步机制来协同这种访问。上面的示例代码,把它改成一个同步方法,就可以防止这种错误的发生。public class UnsafeSequene{
private int value;
//返回一个唯一的数值
public synchronized int getNext(){
return value++;
活跃性问题
安全性的含义是,永远不发生糟糕的事情。活跃性是,某件正确的事情最终会发生。当某个操作无法继续执行下去时,就会发生活跃性问题,比如程序代码进入死循环。所线程导致的死锁,也是活跃性问题,比如线程 A 在等待线程 B 释放其持有的资源,而线程 B 永远都不释放改资源,那么,线程 A 就会永远的等待下去。
性能问题
活跃性意味着某件正确的事情最终会发生,但却不够好。这就是性能问题,因为我们通常希望正确的事尽快发生。性能问题包括:服务时间过长,响应不灵敏,吞吐率过低,资源消耗过高等。
良好的并发程序,线程能提高性能,但无论如何,总会带来某种程度的运行时开销。
1.线程调度临时挂起活跃线程并转而运行另一个线程时,就会频繁的出现上下文切换,带来极大的开销:保存和恢复执行上下文,CPU 时间更多的花在线程调度而不是线程运行上。
2.使用同步机制,往往会抑制某些编译器优化。
线程无处不在
即使在程序中没有显示的创建线程,但在框架中仍可能会创建线程,因此在这些线程中调用的代码同样必须是线程安全的。框架通过在框架线程中调用应用程序代码将并发性引入到程序中。在代码中将不可避免地访问应用程序状态,因此所有访问这些状态的代码路径都必须是线程安全的。
下面给出的模块都将在应用程序之外的线程中调用应用程序的代码。Timer
Servlet 和 JavaServer Page
远程调用方法
Swing 和 AWT本文原创首发于微信公众号 [ 林里少年 ],欢迎关注第一时间获取更新。
Java并发编程实战_[Java并发编程实战] 简介相关推荐
- java高并发编程艺术_[高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?
一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...
- java 多线程不安全_多线程并发为什么不安全
一.线程安全定义 定义: 多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果 ...
- pta中java编程题_多文件编程题
多文件编程题与函数题相似,区别是裁判编写的判题程序可能涉及多个文件,因此不是写在题干里,而是以附件的形式供学生下载,方便学生调试.学生须按照题干上给出的要求编写程序,完成指定功能.学生的提交也可能包含 ...
- 扇贝python编程课_【扇贝编程python安卓手机下载】扇贝编程app v1.1.47 破解版-趣致软件园...
扇贝编程python是运行于安卓平台的一款专业Python课程学习应用,该应用内置了专业强大的教研团队与交互式学习方法,同时还能够支持电脑.手机进度同步,自动保存学习进度,让用户能够使用扇贝编程轻松精 ...
- java教程孙鑫_[Java基础] 孙鑫老师JAVA无难事视频教程 最适合java入门学习打基础的课程 附源码...
资源介绍 课程介绍 由孙鑫老师亲自授课录制.内容涵盖面广,从入门到精通,授课通俗易懂,分析问题独到精辟,学员通过本套光盘的学习,能够快速掌握Java编程语言,成为Java高手. 由孙鑫老师亲自授课录制 ...
- java 字符串格式替换_[Java] - 格式字符串替换方法
Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...
- java 基础面试 英文_[Java面试] 面试java基础总结大全
原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...
- ab plc编程软件_三菱PLC编程程序PLC的软件编程
三菱PLC编程程序-PLC的软件编程 BL2 RACKMOUNT 4U系列工控机 - 搭载Intel第六代core i系列CPU, I3-6100, I5-6500, I7-6700 CPU可选 - ...
- 快速理解编程结构_为什么系统编程全都用英文而不用中文?听完专家的解释恍然大悟!...
全球博弈(quanqiuboyi)--不一样的观点,不一样的解读,8000万人订阅的超级微信大号.不关注时事,你将会被这个世界抛弃,点击标题下蓝字"全球博弈"关注,我们将为您提供有 ...
最新文章
- 浅析ajax原理与用法
- opencv 实现进度控制
- java 无法找到ant_无法找到与ANT(mac)关联的文件
- 浅谈Ubuntu上离线安装包的制作与安装问题
- 干货!!!MySQL 大表优化方案(1)
- Emacs高亮设置:Hi-Lock mode笔记
- 学习分享会(2019.5.31)
- struts2官方 中文教程 系列六:表单验证
- 图解算法系列笔记(二)
- linux挂载硬盘_Linux中如何对硬盘进行分区、格式化、挂载使用
- 应用:Xbox 360无线大屏幕控制器“WP 7”
- 新版WIFI分销微信小程序源码+亲测可用
- 「45课时热泵仿真」Excel热泵系统热力计算与仿真全课程
- 目标设定的SMART原则
- 专利技术交底书撰写经历
- 科三十六项操作方法指导
- Windows注册表详解
- 泊松分布以及相关分布的知识整理
- FPGA实现贪吃蛇小游戏
- MMC子系统调用过程浅析(Core层)