我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于线程、并发的基本概念(详解)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于线程、并发的基本概念(详解)

什么是线程?

提到“线程”总免不了要和“进程”做比较,而我认为在Java并发编程中混淆的不是“线程”和“进程”的区别,而是“任务(Task)”。进程是表示资源分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。关于“线程”和“进程”的区别耳熟能详,说来说去就一句话:通常来讲一个程序有一个进程,而一个进程可以有多个线程。

但是“任务”是很容易忽略的一个概念。我们在实际编码中通常会看到这么一个包叫做xxx.xxx.task,包下是XxxTask等等以Task后缀名结尾的类。而XxxTask类通常都是实现Runnable接口或者Thread类。严格来说,“任务”和并发编程没多大关系,就算是单线程结构化顺序编程中,我们也可以定义一个Task类,在类中执行我们想要完成的一系列操作。“任务”我认为是我们人为定义的一个概念,既抽象又具体,抽象在它指由软件完成的一个活动,它可以是一个线程,也可以是多个线程共同达到某一目的的操作,具体在于它是我们认为指定实实在在的操作,例如:定时获取天气任务(定时任务),下线任务……关键就在于不要认为一个任务对应的就是一个线程,也许它是多个线程,甚至在这个任务中是一个线程池,这个线程池处理这个我们定义的操作。

我产生“线程”和“任务”的疑惑就是在《Thinking in Java》这本书的“并发”章节中它将线程直接定义为一个任务,在开篇标题就取名为“定义任务”,并且提到定义任务只需实现Runnable接口.而这个任务则是通过调用start来创建一改新的线程来执行.说来说去有点绕,其实也不必纠结于在书中时而提到线程,时而提到人任务.我认为就记住:任务是我们在编程时所赋这段代码的实际意义,而线程就关注它是否安全,是否需要安全,这就是后面要提到的线程安全问题.在像我一样产生疑惑时,不用在意它两者间的关系和提法。

什么是并发?

提到了并发,那又不得不和并行作比较。并发是指在一段时间内同时做多个事情,比如在1点-2点洗碗、洗衣服等。而并行是指在同一时刻做多个事情,比如1点我左手画圆右手画方。两个很重要的区别就是“一段时间”和“同一时刻”.在操作系统中就是:

1) 并发就是在单核处理中同时处理多个任务。(这里的同时指的是逻辑上的同时)

2) 并行就是在多核处理器中同时处理多个任务。(这里的同时指的就是物理上的同时)

初学编程基本上都是单线程结构化编程,或者说是根本就接触不到线程这个概念,反正程序照着自己实现的逻辑,程序一步一步按照我们的逻辑去实现并且得到希望输出的结果。但随着编程能力的提高,以及应用场景的复杂多变,我们不得不要面临多线程并发编程。而初学多线程并发编程时,常常出现一些预料之外的结果,这就是涉及到“线程安全”问题。

什么线程安全?

这是在多线程并发编程中需要引起足够重视的问题,如果你的线程不足够“安全”,程序就可能出现难以预料,以及难以复现的结果。《Java并发编程实战》提到对线程安全不好做一个定义,我的简单理解就是:线程安全就是指程序按照你的代码逻辑执行,并始终输出预定的结果。书中的给的定义:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。具体有关线程安全的问题,例如原子性、可见性等等不在这里做详细阐述,适当的时候会进行详细介绍,简单说一点,想要这个线程安全,得在访问的时候给它上个锁,不让其他线程访问,当然这种说法不严谨,不过可以暂时这么理解。

以上是从基本概念理论出发来大致了解需要知道的一些概念,下面就针对JDK中有关线程的API来对多线程并发编程做一个了解。

java.lang.Object  -public void notify()//唤醒这个对象监视器正在等待获取锁的一个线程  -public void notifyAll()//唤醒这个对象监视器上正在等待获取锁的所有线程  -public void wait()//导致当前线程等待另一个线程调用notify()或notifyAll()  -public void wait(long timeout)// 导致当前线程等待另一个线程调用notify()或notifyAll(),或者达到timeout时间  -public void wait(long timeout, int nanos)//与上个方法相同,只是将时间控制到了纳秒nanos

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于线程、并发的基本概念(详解)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于线程、并发的基本概念(详解)

什么是线程?提到“线程”总免不了要和“进程”做比较,而我认为在Java并发编程中混淆的不是“线程”和“进程”的区别,而是“任务(Task)”。进程是表示资源分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。关于
2023-05-31

基于java中集合的概念(详解)

1.集合是储存对象的,长度可变,可以封装不同的对象2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加)就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类.二每一个容器的数
2023-05-31

基于多线程并发的常见问题(详解)

一 概述1.volatile保证共享数据一旦被修改就会立即同步到共享内存(堆或者方法区)中。2.线程访问堆中数据的过程线程在栈中建立一个数据的副本,修改完毕后将数据同步到堆中。3.指令重排为了提高执行效率,CPU会将没有依赖关系的指令重新排
2023-05-31

Java4Android开发教程(三)java基本概念

什么是环境变量? 环境变量通常是指在操作系统当中,用来指定操作系统运行时需要的一些参数。通常为一系列的键值对。 path环境变量的作用 path环境变量是操作系统外部命令搜索路径 什么是外部命令搜索路径?举个例子,如在cmd下执行ipcon
2022-06-06

VB.NET多维数组基本概念详解

VB.NET中的多维数组是一种特殊的数据结构,它可以存储多个值,并且可以按照多个维度进行索引和访问。多维数组的基本概念包括以下几点:1. 维度:多维数组可以有多个维度,每个维度表示数组中的一个方向。例如,一个二维数组可以有两个维度,分别表示
2023-09-22

Java线程安全基础概念解析

Java线程安全初步了解。JAVA线程安全从总体上来说,是指Java对象在多线程运行环境下的一种特性,表现为常规(区别于特殊调用情况)情况下每次调用都能得到正确的逻辑结果。从本质上来说,将对象的方法行为加上了同步控制逻辑,而调用者无须做其他
2023-05-31

Java 虚拟机(JVM)之基本概念详解

1、类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间。2、方法区:就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决
2023-05-31

了解MySQL触发器的基本概念与用途

了解MySQL触发器的基本概念与用途MySQL触发器是一种特殊类型的存储过程,它在数据库中的表上定义了一系列的动作,当满足触发条件时就会被自动激活执行。通过触发器,可以实现数据库表的自动化操作,比如在插入、更新、删除等动作发生时执行相应的
了解MySQL触发器的基本概念与用途
2024-03-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录