多线程的三大特性:原子性、可见性和有序性

简介: 多线程的三大特性:原子性、可见性和有序性

原子性(Atomicity)

原子性是指一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在并发编程中,原子性是一个关键概念,因为它确保了数据的一致性和线程安全。

例如,假设有一个银行账户余额的变量,两个线程分别尝试对其进行增加操作。如果没有原子性的保证,一个线程可能在读取余额、计算新余额和写回新余额的过程中被另一个线程打断,导致数据不一致。通过使用原子操作(例如,通过synchronized关键字或java.util.concurrent.atomic包中的原子类),可以确保这些操作作为一个不可分割的单元来执行,从而避免了不一致性。

可见性(Visibility)

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。在并发编程中,由于JVM的优化和CPU的缓存机制,一个线程对共享变量的修改可能不会立即对其他线程可见。这就是所谓的“可见性问题”。

为了确保可见性,Java提供了volatile关键字。当一个变量被声明为volatile时,JVM会保证所有线程看到这个变量的值是一致的。当一个线程修改了一个volatile变量的值,这个修改会立即同步到主内存,当有其他线程需要读取这个变量时,它会去主内存中读取新值。

有序性(Ordering)

有序性是指程序执行的顺序按照代码的先后顺序执行。在单线程环境中,这通常是自然的,因为代码是按照顺序一行一行执行的。然而,在并发环境中,由于JVM和CPU的优化,指令的执行顺序可能会与代码中的顺序不同。

为了确保有序性,Java提供了volatile关键字和synchronized关键字。volatile关键字会禁止指令重排,确保对volatile变量的操作按照预期的顺序执行。而synchronized关键字则提供了一种互斥锁的机制,确保同一时间只有一个线程能够访问共享变量,从而避免了指令重排带来的问题。

目录
相关文章
|
23天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
3月前
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
202 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
3月前
|
缓存 Java 编译器
【多线程-从零开始-伍】volatile关键字和内存可见性问题
【多线程-从零开始-伍】volatile关键字和内存可见性问题
58 0
|
3月前
|
设计模式 监控 安全
Python多线程编程:特性、挑战与最佳实践
Python多线程编程:特性、挑战与最佳实践
50 0
|
3月前
|
设计模式 监控 安全
Python多线程编程:特性、挑战与最佳实践【1】
Python多线程编程:特性、挑战与最佳实践【1】
42 0
|
5月前
|
NoSQL 安全 Java
Lettuce的特性和内部实现问题之Lettuce连接与Jedis连接在线程安全性的问题如何解决
Lettuce的特性和内部实现问题之Lettuce连接与Jedis连接在线程安全性的问题如何解决
|
6月前
|
消息中间件 缓存 NoSQL
Redis快速度特性及为什么支持多线程及应用场景
Redis快速度特性及为什么支持多线程及应用场景
134 11
|
5月前
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
|
5月前
|
算法 Java
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
|
6月前
|
缓存 Java 编译器
多线程内存模型问题之保证Java中的原子性,如何解决
多线程内存模型问题之保证Java中的原子性,如何解决