文档章节

Java并发编程之进程与线程

12叔
 12叔
发布于 2017/08/26 10:39
字数 1372
阅读 36
收藏 3
点赞 0
评论 0

引子

今天我们来探讨一下并发编程的相关内容, 首先我们思考的问题是为什么需要并发,并发解决了什么问题, 要理解这个问题,我们先来看看进程和线程的概念

进程和线程

我们先理解一下什么是进程

进程是具有一个独立的执行环境。通常情况下,进程拥有一个完整的、私有的基本运行资源集合,每个进程都有自己的内存空间 , 进程往往被看作是程序或应用的代名词

简单来说进程就是程序执行的一个实例.

我们再回顾一下计算机发展的历史,一开始我们使用批处理的计算机系统,

批处理

程序排队依次运行,一个cpu只能同时只能运行一个程序.

但是因为CPU处理的速度太快了,寄存器仅仅能够追的上他的脚步,内存和其他设备完全是望其项背,所以导致cpu一直在等待一些IO操作而导致资源的浪费,人们想提高资源利用率,所以人们提出了多任务系统.

多任务

所谓多任务系统就是每个进程系统分配了固定的执行时间,轮流的执行,所以当固定的时间片用完或者当程序遇到IO操作导致阻塞的时候,系统都会对进程进行上下文切换,切换的时候进程需要保存打开的文件句柄,程序段和数据段的地址,已经使用CPU的时间,等待CPU的时间等程序运行的信息,方便下次运行的时候恢复程序当前的状态,进程会保存到一个阻塞队列中等待IO操作完成了,就会进入就绪队列等待再次运行.

这样虽然在同一时刻只有一个程序在运行, 但是有很多程序在短时间内不断的切换, 在外界看来,似乎多个程序在同时执行

线程

但是新的问题又出现了,现在的程序一般都有用户界面,比如文本编辑器,当人们在打字的时候,可能会有自动保存的功能,自动保存文字是和IO打交道,那硬盘有多慢你也知道,因为IO阻塞了这时候操作系统会把整个进程挂起, 给人类的感觉就是: 程序死了,键盘和鼠标不响应了! 无法继续输入文字, 但是过一会儿就好了.

人们一开始想用多个进程来实现这个功能,但是多个进程之间切换因为要保存上下文、调入上下文,一旦多了的时候,还是有一定的时间消耗的。 而且进程之间的资源又是相互独立的,进程通信的代价太大了. 为了进一步提高资源利用率,人们在进程中,引入了线程,可以认为线程是一种轻量级的进程,运行在进程的内部,所以可以共享进程的所有资源,例如地址空间,全局变量,文件资源等等 但是每个线程也有自己独特的部分, 那就是要记住自己运行到哪一行指令了, 有自己的函数调用堆栈,自己的状态等等, 总而言之,就是为了能像切换进程那样切换线程, 这样我们就可以把用户界面和保存功能分为2个线程 保存导致的IO操作就不会阻塞用户界面了.

输入图片说明

线程的实现

关于线程的实现也有一些分歧,一种是希望在进程中实现,一种是希望在操作系统内实现

在进程中实现可以自己定制自己的调度算法,多灵活啊;
所有的线程切换都在进程内完成, 不用请求操作系统内核来处理,效率高, 但是存在一个致命问题,一旦其中一个线程阻塞了,系统就会认为整个进程阻塞了,从而会进行切换,那进程就不响应了. 所以实际上的实现上的实现是混合的一个实现 用户空间的进程可以创建线程(用户线程), 内核也会创建线程(内核线程), 用户线程映射到内核线程上从而可以接受操作系统的调度. 输入图片说明

总结

那么为什么需要并发这个问题,我们大体上得出了答案, 就是为了提高系统的资源利用率和系统的吞吐量

我们可以使用进程或线程来实现并发, 但是由于多进程的资源消耗较大,并且进程通信不方便,所以我们进一步提出了线程作为我们并发的实现 现代的操作系统中线程是cpu调度的最小单元,而进程只是资源的分配的最小单元.

当然多线程编程过程会相对复杂,并且会出现多个线程同时操作同一个数据,导致线程安全问题, 这个问题我们下文继续探讨.

© 著作权归作者所有

共有 人打赏支持
12叔

12叔

粉丝 143
博文 24
码字总数 52225
作品 3
杭州
程序员
Java 使用 happen-before 规则实现共享变量的同步操作

前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。按照官方的...

stateIs0 ⋅ 01/20 ⋅ 0

Java 编程之美:并发编程高级篇之一

本文来自作者 追梦 在 GitChat 上分享 「Java 编程之美:并发编程高级篇之一」 编辑 | 工藤 前言 借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。 ...

gitchat ⋅ 05/24 ⋅ 0

使用zookeeper序列节点实现不可重入分布式锁

一、前言 在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就...

加多 ⋅ 01/12 ⋅ 0

Java 编程之美:并发编程基础晋级篇

本文来自作者 加多 在 GitChat 上分享 「Java 并发编程之美:并发编程基础晋级篇」 编辑 | Mc Jin 借用 Java 并发编程实践中的话,编写正确的程序并不容易,而编写正常的并发程序就更难了! ...

gitchat ⋅ 04/18 ⋅ 0

Java面试需要准备哪些多线程并发的技术要点

一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一...

码蚁说架构 ⋅ 05/31 ⋅ 0

计算机科学中抽象的好处与问题—伪共享实例分析

David John Wheeler有一句名言“计算机科学中的任何问题都可以通过加上一层间接层来解决”,一层不够就再加一层。后半句是我加的 (* ̄︶ ̄) ,虽然有点玩笑的意思,但是也的确能说明一些问题...

MageekChiu ⋅ 01/10 ⋅ 0

Java并发基础你需要知道的基础知识

多线程和并发编程是Java里面的核心内容,通常有以下一些概念需要重点掌握。 线程; 锁; 同步器; 并发容器和框架; Java并发工具类; 原子操作类; Executor框架(执行机制); 并发基础概念 ...

异步社区 ⋅ 05/30 ⋅ 0

Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀 ⋅ 04/16 ⋅ 0

【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___ ⋅ 05/06 ⋅ 0

Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀 ⋅ 04/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout基于内存的DataMode 推荐引擎Demo2

Mahout基于内存的DataMode 推荐引擎Demo2 //注释的部分是基于文件也可以理解为基于日志文件的, //DataModel 可以有很多种,实现abstractDataMode的子类,原则上都可以作为数据源,个人觉得,...

xiaomin0322 ⋅ 15分钟前 ⋅ 0

Docker部署Tomcat及Web应用

一、在线下载docker yum install -y epel-releaseyum install docker-io # 安装dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务 1 ...

Jeam_ ⋅ 15分钟前 ⋅ 0

研发运营一体化能力成熟度模型

研发运营一体化是指在 IT 软件及相关服务的研发及交付过程中,将应用的需求、开发、测试、部 署和运营统一起来,基于整个组织的协作和应用架构的优化,实现敏捷开发、持续交付和应用运营的无...

stars永恒 ⋅ 20分钟前 ⋅ 0

jQuery缩小放大触发事件

jquery的resize()方法使用 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> var i = 0; $(document).ready(function(){ ......

RobertZou ⋅ 21分钟前 ⋅ 0

eclipse python 搭建

https://jingyan.baidu.com/article/9113f81b68ebce2b3214c7e0.html https://www.cnblogs.com/ZhangRuoXu/p/6397756.html https://blog.csdn.net/zhangphil/article/details/78962159 字符集......

之渊 ⋅ 21分钟前 ⋅ 0

weex,react native,flutter

weex: 一次编写,处处运行 RN: 学一次,到处写(针对安卓,IOS平台特性 各自写,会有很大一部分是一样的代码) 这些方案是否真正的解决了跨平台问题呢?从目前的状况来看,很显然是没有的,因...

东东笔记 ⋅ 27分钟前 ⋅ 0

Spring Cloud微服务分布式云架构-集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

明理萝 ⋅ 32分钟前 ⋅ 1

SpringMVC图片上传问题解决

当我们上传图片时一直发现: MultipartFile file = null; if (request instanceof MultipartHttpServletRequest) 匹配不上, 解决方案: 在前端xml加入如下配置代码即可 <!-- 图片上传bean --...

泉天下 ⋅ 34分钟前 ⋅ 0

Spring表达式语言(SpEL)

1、SpEL引用 Spring EL在bean创建时执行其中的表达式。此外,所有的Spring表达式都可以通过XML或注解的方式实现。下面将使用Spring表达式语言(SpEL),注入字符串,整数,Bean到属性。 SpEL的...

霍淇滨 ⋅ 50分钟前 ⋅ 0

Gradle使用阿里云镜像

gradle 生命周期中有一个初始化( Initialization )的过程,这个过程运行在 build script 之前,我们可以在这个地方做一点系统全局的设置,如配置仓库地址。 你可以在以下几个位置实现仓库地址...

明MikeWoo ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部