美文网首页
并发三大特性

并发三大特性

作者: 希希里之海 | 来源:发表于2019-08-28 16:07 被阅读0次

[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接口 保障可见性。

相关文章

网友评论

      本文标题:并发三大特性

      本文链接:https://www.haomeiwen.com/subject/bckmectx.html