并发三大特性

[TOC]

并发三大特性

原子性、可见性、有序性

1. 原子性

含义

一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。

在 Java 中,对基本数据类型的变量读取赋值操作是原子性操作。

重要

不采取任何的原子性保障措施的自增操作并不是原子性的。

如何保证原子性
  • 通过 synchronized 关键字定义同步代码块或者同步方法保障原子性。
  • 通过 Lock 接口保障原子性。
  • 通过 Atomic 类型保障原子性。

2. 可见性

含义

当一个线程修改了共享变量的值,其他线程能够看到修改的值。

Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法来实现可见性的。

如线程 A 修改一个普通变量的值,然后向主内存进行回写,另外一条线程 B 在线程 A 回写完成了之后再从主内存进行读取操作,新变量的值才会对线程 B 可见。

可见性问题

举个例子:

// 线程1执行的代码
int i = 0;
i = 10;
 
// 线程2执行的代码
j = i;

假若执行线程 1 的是 CPU1,执行线程 2 的是 CPU2 。由上面的分析可知,当线程 1 执行 i =10 这句时,会先把 i 的初始值加载到 CPU1 的高速缓存中,然后赋值为 10 ,那么在 CPU1 的高速缓存当中 i 的值变为 10 了,却没有立即写入到主存当中。

此时线程 2 执行 j = i,它会先去主存读取i的值并加载到 CPU2 的缓存当中,注意此时内存当中i的值还是 0,那么就会使得j的值为 0 ,而不是 10。

这就是可见性问题,线程 1 对变量 i 修改了之后,线程2没有立即看到线程 1 修改的值。

如何保证可见性
  • 通过 volatile 关键字标记内存屏障保证可见性。
  • 通过 synchronized 关键字定义同步代码块或者同步方法保障可见性。
  • 通过 Lock 接口保障可见性。
  • 通过 Atomic 类型保障可见性。
  • 通过 final 关键字保障可见性

3. 有序性

含义

即程序执行的顺序按照代码的先后顺序执行。

JVM 存在指令重排,所以存在有序性问题。

如何保证有序性
  • 通过 synchronized关键字 定义同步代码块或者同步方法保障可见性。
  • 通过 Lock接口 保障可见性。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 java并发机制的底层实现原理 Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 2.1 vo...
    kennethan阅读 1,536评论 0 2
  • 并发编程中两大核心:JMM抽象内存模型以及happens-before规则、三大特性(原子性、有序性、可见性) 一...
    程序猿老徐阅读 1,741评论 0 1
  • 第6章类文件结构 6.1 概述 6.2 无关性基石 6.3 Class类文件的结构 java虚拟机不和包括java...
    kennethan阅读 1,070评论 0 2
  • 目录: 1. 指令重排 2. 顺序一致性 3. volatile 4. final 1.指令重排 要了解指令重排,...
    西部小笼包阅读 895评论 0 1
  • 除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性...
    胡二囧阅读 1,461评论 0 12

友情链接更多精彩内容