概述
多线程三大特性:原子性、可见性、有序性。
1. 原子性
原子性是指:多个操作作为一个整体,不能被分割与中断,也不能被其他线程干扰。如果被中断与干扰,则会出现数据异常、逻辑异常。
多个操作合并的整体,我们称之为复合操作。一个复合操作,往往存在前后依赖关系,后一个操作依赖上一个操作的结果。如果上一个操作结果被其他线程干扰,对于当前线程看来整个复合操作的结果便不符合预期。同理线程也不能在复合操作中间被中断,中断必须发生在进入复合操作之前或者等到复合操作结束之后。
保证原子性就是在多线程环境下,保证单个线程执行复合操作符合预期逻辑。
典型的复合操作:『先检查后执行』和『读取—修改—写入』
1.1 先检查后执行
@NotThreadSafe
public class LazyInitClass {
private static LazyInitClass instance ;
public static LazyInitClass getInstance() {
if(instance == null)
instance = new LazyInitClass() ;
return instance ;
}
}
LazyInitClass 的 getInstance 中包含先检查后执行的复合操作,通常我们也可以称 getInstance 中包含竞态条件。假设线程 A 和线程 B 同时执行 getInstance。A 看到 instance 为空,便执行 new LazyInitClass() 逻辑。A 还未完成初始化并设置 instance,B 检查 instance,此时 instance 为空,B 便也会执行 new LazyInitClass()。那么两次调用 getInstan

本文详细介绍了Java并发编程中的多线程三大特性:原子性、可见性和有序性。原子性涉及复合操作的不可中断性,如`synchronized`和`Atomic`类用于保证。可见性问题源于缓存可能导致线程间数据不一致,`volatile`关键字可解决此问题。有序性问题主要由指令重排序和CPU缓存引起,通过内存屏障和同步块来维护。正确理解和应用这些特性是编写正确多线程程序的关键。
最低0.47元/天 解锁文章
2260

被折叠的 条评论
为什么被折叠?



