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

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

原子性(Atomicity)

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

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

可见性(Visibility)

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

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

有序性(Ordering)

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

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

目录
相关文章
|
4月前
|
缓存 算法 Java
多线程04 死锁,线程可见性
多线程04 死锁,线程可见性
23 0
|
4月前
|
Java
Java线程面试题:什么是原子性问题?如何解决?
Java线程面试题:什么是原子性问题?如何解决?
32 0
|
5月前
|
缓存 安全 Java
3.线程安全之可见性、有序性、原子性是什么?
3.线程安全之可见性、有序性、原子性是什么?
44 0
3.线程安全之可见性、有序性、原子性是什么?
|
10月前
|
缓存 安全 Java
【Java基础】线程的原子性、可见性、有序性及线程安全知识整理
一个操作或者多个操作,要么全部执行,并且执行的过程不会被打断, 要么就全部不执行(一个操作是不可被分割的)。
|
11月前
|
SQL Java easyexcel
多线程事务如何保证效率和原子性
多线程事务如何保证效率和原子性
166 0
|
12月前
|
缓存 Java 编译器
并发编程-06线程安全性之可见性 (synchronized + volatile)
并发编程-06线程安全性之可见性 (synchronized + volatile)
68 0
|
12月前
|
安全 Java
并发编程-05线程安全性之原子性【锁之synchronized】
并发编程-05线程安全性之原子性【锁之synchronized】
76 0
|
12月前
|
缓存 安全 Java
并发编程-04线程安全性之原子性Atomic包的4种类型详解
并发编程-04线程安全性之原子性Atomic包的4种类型详解
34 0
|
12月前
|
存储 安全 算法
并发编程-03线程安全性之原子性(Atomic包)及原理分析
并发编程-03线程安全性之原子性(Atomic包)及原理分析
68 0
|
3天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
11 1