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

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

文章目录

一、进程与线程

二、并发

三、线程间通信

四、Java 并发 3 特性





一、进程与线程


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


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


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



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


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






二、并发


CPU 是多核的 ;


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


每个进程 中 有若干 线程 ;


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


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


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


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


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


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


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


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

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






三、线程间通信


线程间通信 :


假设有 2 22 个线程 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 并发的 3 33 特性 :


原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 3 33 个步骤 , 首先从主内存中读取 a 变量 , 然后进行自增操作 , 最后在将自增后的值写回主内存中 ;

可见性 : 多个线程 访问同一个变量 , 该变量一旦被 某个线程修改 , 这些线程必须可以 立刻看到被修改的值 ;

有序性 : 程序按照 代码先后顺序 执行 ;


目录
相关文章
|
2月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
186 0
|
1月前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
142 59
|
10天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
16天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
22天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
2月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
29 1
|
15天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
24天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
32 1
|
1月前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
46 3
|
2月前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。