【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 变量 , 然后进行自增操作 , 最后在将自增后的值写回主内存中 ;

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

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


目录
相关文章
|
11月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
1288 2
|
11月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
543 1
|
11月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
480 1
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
493 0
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
355 1
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
289 0
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
287 0
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。