本文是Java并发系列的开篇,主要讲一些并发的计算机基础知识。本系列所讲的知识框架也是基于《Java并发编程的艺术》一书,所讲的内容也多围绕于并发concurrent包下的类。

正文

并发的前提是多线程间的协同运作,如果是程序是单线程运作并发也无从谈起。那么首先要理解两个问题。

什么是进程、线程?

答:进程是程序的运行过程,有内存空间、CPU运行时间、IO设备,进程是系统进行资源分配和调度的一个独立单位。

  线程是CPU独立运行和独立调度的基本单位,一个进程里可以拥有多个线程,进程空间包括不同线程可共同访问的公共空间和私有空间。

Java开启多线程的方式?

1、装配runnable接口,重写run()方法。

2、继承Thread类,重写它的Start方法。

Java线程状态?

Java线程间的协作方式?

  显然,不进行协作的多线程它们的作用要大打折扣,而线程协作关注的两个重要问题是Java线程间如何进行通信以及线程间如何进行同步?

  Java采用的共享内存模型,线程间通过正确同步和读写共享内存数据达到线程通信和同步的目的,当然要正确的读写共享内存绝不是容易的事情,它包括了很多并发知识。但我们现在只要建立这种认知就够了。

  Java间有以下协作的方式:1、等待通知机制(Synchronized和object配合、Lock和Condition配合)

              2、volatile

              3、synchronized

              4、管道流

   它们直接的详细内容会在后文讲到。

为什么会出现并发结果不一致问题?

  为什么没有正确编写程序会引发并发问题?这跟计算机底层运行机制有关。

  1、重排序问题(重排序为了提高程序运行效率),Java重排需只保证了单线程的结果一致性,没有保证多线程结果一致性,保证多线程结果一致性的是happens-before规则。重排序包括编译器重排序、指令集重排序、CPU重排序,它们都会让多线程出现并发问题。

  2缓存问题,首先Java线程通信是采用共享内存的方式通信,A线程将数据写入主内存,B线程从主内存读取数据以达到通信目的。系统为了提高效率建立了缓存,它导致了线程和共享内存间的通信并不是即时的,所以会出现并发问题。

  Java本身也只是保证了as-if-serial语言,即保证单线程程序运算结果不会改变。而对于多线程结果不改变的语义happens-before语义则只保证正确同步的程序结果不变。

  Java保证并发Volatile、Sychronized关键字和CAS操作起到了关键作用,它们的知识点在下篇文章:

https://www.cnblogs.com/llsblog/p/10629168.html

转载于:https://www.cnblogs.com/llsblog/p/10629119.html

并发系列1:并发基础知识相关推荐

  1. 线程基础,多线程架构,高并发,线程安全基础知识

    线程基础,多线程架构,高并发,线程安全基础知识 线程基础 一.线程安全 1.1概念:当多个线程访问某一个类(对象或者方法)时,这个类始终都能表现出正确额行为,那么这个类(对象或者方法)就是线程安全的. ...

  2. jQuery小测试系列之jQuery基础知识

    日期:2012-4-17  来源:GBin1.com 这是jQuery小测试系列第一部分:基础知识. 来源:jQuery小测试系列之jQuery基础知识

  3. python独立网站教程_python从零到独立建设网站系列教程之基础知识篇(二)

    python从零到独立建设网站系列教程之基础知识篇(二)python的安装在Windows上安装python点击Download链接 然后就是按导航走点击确认,需要注意的是要把python加入到系统变 ...

  4. 《并发与高并发系列第一集-基础与概念》

    面试官:看你简历上写,最近正在写并发编程方面的博客,是吧? 安琪拉:闲来无事,看看闲书,写写段子,承蒙读者厚爱,有此打算. 面试官:少跟我这拽文,"闲来无事"?阿里不用996吗? ...

  5. java春招面试冲刺系列:redis基础知识详细解析

    目录 学习计划 学习笔记 百问 redis在什么情况下会变慢? 单线程的redis,如何知道要运行定时任务? 学习计划 Redis的介绍.优缺点.使用场景 Linux中的安装 常用命令 Redis各个 ...

  6. GNN 系列:Graph 基础知识介绍

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 [导读]图卷积神经网络(Graph Convolutional Network)作为最 ...

  7. 【Linux系列】Linux基础知识整理

    Linux操作系统在服务器领域广泛的使用到,作为一个后台开发工程师很有必要了解Linux相关的知识. 本篇日志是我学习Linux过程中的简单记录和总结.本着"理论够用,实践为主"的 ...

  8. Web音视频入门系列——音视频基础知识

    前言 21世纪以来,随着网络基础设施的不断完善,3G.4G.乃至现今5G网络的普及,互联网彻底改变了我们的生活.以前在家里看一部电影需要买DVD和播放机,现在直接打开浏览器,进各大视频网站就可以看了, ...

  9. Python复习系列:Python基础知识(三)

    Python基础知识(三) Python基础知识(三) (一)循环结构和选择结构 1. 条件表达式 2. 选择结构 2.1 单分支选择结构 2.2 双分支选择结构 2.3 多分支选择结构 2.4 选择 ...

  10. Java并发编程笔记—摘抄—基础知识

    什么是线程安全 当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 竞态 ...

最新文章

  1. 【翻译】旧技术成就新勒索软件,Petya添加蠕虫特性
  2. 51CTO论坛资料共享改版细分等您来!
  3. 7月平均工资下来,Java程序员哭笑不得!
  4. 移动应用开发必备工具盘点
  5. TuShare获取K线数据
  6. 微信小程序扫码的代码及获取二维码的url地址
  7. CentOS7 Firewall NAT 及端口映射
  8. mysql对日期的操作_MySql对日期的操作
  9. 梯度下降算法以及线性回归模型
  10. python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR
  11. java单元测试(@Test)
  12. windows本地安装PLSQL
  13. (22) 基于动态时空图卷积神经网络的交通流预测
  14. 在万能地图下载器中如何不显示谷歌电子地图上的地名文字?
  15. 敏捷开发模式几个名词
  16. 年度最高奖金【双百万】:2021年全国人工智能大赛开赛啦
  17. 关于html中锚点功能的使用
  18. java-net-php-python-java校园约球网站计算机毕业设计程序
  19. Photoshop简单几步打造酷火焰字特…
  20. mysql 8 全文检索_MySQL 8中使用全文检索示例

热门文章

  1. mysql子查询的方式_分布式系统中一种迭代处理MYSQL子查询的方法
  2. 2019深圳杯获奖论文_2019年第六届深圳南山杯全国手风琴网络邀请赛获奖名单、成绩公布!...
  3. 北京航空航天大学计算机专业培养方案,北京航空航天大学计算机科学与技术专业...
  4. 增加网格_网格交易法(期货)
  5. 什么是php工作流,什么是工作流?
  6. pythonxml解析拿到控件坐标_Python解析xml中dom元素的方法
  7. 锁住文件linux,linux新手教程之创建锁文件的方法
  8. python九九乘法表求和,平均数,最大值,最小值、金字塔、等边三角形
  9. AAAIT学院JDK15新特性JAVA15版本
  10. 有两个不同list,需要对比两个list内容且输出差异的内容