文章目录

  • 一、进程与线程
  • 二、并发
  • 三、线程间通信
  • 四、Java 并发 3 特性

一、进程与线程


最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交互的逻辑 , 二者只能 交替进行 , 这样 CPU 执行效率就很低 ;

CPU 是整个计算机系统中的 稀缺资源 , 程序的运行 , 计算 都需要依赖 CPU 完成 ;

为了 高效利用 CPU 这个稀缺资源 , 引入了线程概念 ;

进程 : 每个应用都是一个独立进程 , 是 资源分配 , 调度 的最小单元 ;

线程 : CPU 调度的最小单元 ;

二、并发


CPU 是多核的 ;

进程 是在 物理内存 中执行的 ( 内存条 或 RAM ) ;

每个进程 中 有若干 线程 ;

CPU 运行线程时 , 通过 OS 线程调度 , 在 某个 CPU 的 某个 核 上 执行 某个 进程 的 某个 线程 ;

程序的执行 , 最终是靠指令进行执行 ;

进程 在 内存中 , 会被划分一块 独立的区域 , 每个进程之间的内存都是 隔离 的 , 一个进程的崩溃 , 不会影响其它进程 ;

每个线程执行时 , JVM 都会为该线程单独分配 线程栈 , 本地方法栈 , 程序计数器 , 三者都是线程独有的数据 ;

程序运行 的 指令 , 就放在 上面的 线程栈 中 ;

每个 线程栈 中都有 一串指令 , 等待执行 ;

这些线程栈 , 不能 串行 执行 , 必须 并发 执行 , 才能保证所有的应用程序 , 都能得到很好的用户体验 ;

并行 是 同一个 时间点 处理多个事件 ;
并发 是 同一个 时间段 处理多个事件 ;

三、线程间通信


线程间通信 :

假设有 222 个线程 A 和 B ;

线程一旦执行后 , 会在内存中分配 线程栈 , 该线程栈中有一块 本地内存 ;

有一些对象是共享的 , 所有线程都可以访问 , 如 堆内存 , 在 线程栈 中的 本地内存 中 , 有一个 共享变量的副本 ;

在 主内存 中 , 有很多 共享变量 ;

主内存中有变量 int a = 1 , 如果线程 A 中想要访问变量 a , 就会将该变量 int a = 1 变量 复制到 线程 A 的 本地内存中 ;

如果线程 B 也想访问 , 则将该变量 int a = 1 变量 复制到 线程 B 的 本地内存中 ;

如果在 线程 A 中 , 对变量 a 进行 +1 操作 , 只是对 线程 A 本地内存 中的 变量 a 副本进行了 +1 操作 , 主内存 和 线程 B 中的 a 变量 没有变化 ;

假如 线程 A 和 线程 B 同时对 本地内存 中的变量 a 进行操作 , 那么就有可能出现 a 取值异常的情况 ;

主内存 中的数据 , 对所有的线程都可见 ; 但是 线程 A 和 线程 B 之间 , 互相不知道对方线程 本地内存 中的数据 ;

这种情况就是线程不安全的情况 ;

四、Java 并发 3 特性


Java 并发的 333 特性 :

  • 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 333 个步骤 , 首先从主内存中读取 a 变量 , 然后进行自增操作 , 最后在将自增后的值写回主内存中 ;
  • 可见性 : 多个线程 访问同一个变量 , 该变量一旦被 某个线程修改 , 这些线程必须可以 立刻看到被修改的值 ;
  • 有序性 : 程序按照 代码先后顺序 执行 ;

【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )相关推荐

  1. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  2. 【专家坐堂】四种并发编程模型简介

    本文来自网易云社区 概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" •       并发 :同一时间 对待 多件事情 (逻辑层面) ...

  3. 四种并发编程模型简介

    概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" •       并发 :同一时间 对待 多件事情 (逻辑层面) •       并 ...

  4. Python3 与 C# 并发编程之~进程先导篇

    在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇:h ...

  5. 并发编程中你需要知道的基础概念

    多线程是Java编程中一块非常重要的内容,其中涉及到很多概念.这些概念我们平时经常挂在嘴上,但是真的要让你介绍下这些概念,你可能还真的讲不清楚.这篇博客就总结下多线程编程中经常用到的概念,理解这些概念 ...

  6. 【多线程】java 并发编程中的Condition对象-指定唤醒某个线程

    1.概述 转载:java高并发系列 - 第13天:JUC中的Condition对象 synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition ...

  7. java并发编程基础系列(五): 创建线程的四种方式

    线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...

  8. python线程池并发_python 并发编程多线程之进程池/线程池

    一.验证GIL锁的存在 Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可以"运行"多个线程,但在任意时刻只有一个线程在解释器中运行 ...

  9. 【深入浅出Java并发编程指南】「难点 - 核心 - 遗漏」线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

最新文章

  1. 2019年雁栖湖会议重大科学问题面向全球发布
  2. centos 6是否已安装mysql_Centos6安装mysql
  3. ventory制作U盘启动盘
  4. 第九十六期:JavaScript 中的 4 个相等比较算法的介绍
  5. Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群
  6. 【SRH】------node创建简单的服务器
  7. k8s部署zabbix_Kubernetes 中部署 Zabbix
  8. PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束
  9. linux下用arcconf做raid5,arcconf工具相关命令V1.0
  10. Unity通过压缩字体减小包体大小
  11. php 中mb开头什么意思,mb是兆的意思吗
  12. 【问题解决】QT报错 undefined reference to `__imp__ZN11QSerialPortD1Ev‘
  13. 16 医疗挂号系统_【预约下单】
  14. C++算法之-小球问题
  15. 泊松融合进阶——DFT求解二维泊松方程
  16. 部分GDAL工具功能简介
  17. ​【技术】机器视觉技术原理解析及应用领域
  18. 七面蚂蚁金服,超硬核面经,已拿Offer!!
  19. MYSQL求百分比的几种方法
  20. Python ffmpeg视频处理

热门文章

  1. What Does TTY Stand for in Linux?
  2. JAVA不使用POI给Word文档添加水印
  3. F3PlotStrip
  4. Object_Type列表
  5. profiler 对表跟踪
  6. noip2016 小结(ac两题+学习总结)
  7. 全局变量引起的BUG
  8. 树莓派(Raspberry Pi)修改时区
  9. 硬链接、软链接和inode
  10. jQuery ready(fn) 页面载入函数