美文网首页
1.并发相关的原子性,可见性,顺序一致性,happen-befo

1.并发相关的原子性,可见性,顺序一致性,happen-befo

作者: szhlcy | 来源:发表于2019-06-21 18:02 被阅读0次

 在讲解相关的定义之前,先了解一下CPU在读取数据时候的工作顺序。
 CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。
 其中Intel从Pentium开始将Cache分开,通常分为一级高速缓存L1和二级高速缓存L2。


读写模型

1.原子性

 关于原子性解释:指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。一个经典的例子

i++
这个操作会被分解为
1. 读取i
2. 进行+1操作
3. 写入到缓存

 当一个线程执行的时候上面的操作肯定是原子性的。但是当两个线程进行操作的时候,可能发生下面的情况

第一个线程将寄存器中的值读为0。
第一个线程为值加1,计数器的值应为1,但在将新值写回寄存器之前,它可能会暂停,同时第二个进程正在运行:
第二个线程读取寄存器中的值,该值仍然等于0;
第二个线程为值添加一个;
第二个线程将新值写入寄存器,寄存器现在的值为1。

 而实际情况运行结果应该是2。这个操作是体现了原子性的重要性。

2.可见性

 我对可见性的解释:当一个共享变量被多个线程进行操作的时候,如果变量的值被一个线程修改了,那么另外的一个线程能够知道这个变量的新值。
 导致可见性的原因也是CPU的缓存结构导致的,数据在第一次读取的时候会从主存中拿出来,然后保存在缓冲中,而在读取值的时候每个线程会去先去缓存中获取值。在对变量进行写操作的时候,才会将新的值刷新到主存中。上面再原子性的举例中就能看到这个问题。

3.顺序一致性

 顺序一致性:顺序一致性内存模型是一个理论模型。有两大特征
  1.一个线程中的所有操作必须按照程序的顺序来执行
  2.所有线程都只能看到一个单一的操作执行顺序。(每个操作都必须原子执行且必须立刻对所有的线程可见)
 在java内存模型中,只保证在不改变程序执行结果的前提下,尽可能地为编译器和处理器的优化提供方便。

4.happen-before

 happen-before关系:
  1.代码的执行顺序,编写在前面的发生在编写在后面的
  2.unlock必须发生在lock之后
  3.volatile修饰的变量,对一个变量的写操作,先于对该变量的读操作
  4.传递规则:操作A先于B,B先于C,那么A肯定先于C
  5.线程启动规则:start方法肯定先于线程run
  6.线程终端规则:线程的中断方法interrupt动作,必须发生在捕获该动作之前
  7.对象初始化必须发生在finalize之前。
  8.所有的操作都发生在线程死亡之前。

相关文章

  • 1.并发相关的原子性,可见性,顺序一致性,happen-befo

     在讲解相关的定义之前,先了解一下CPU在读取数据时候的工作顺序。 CPU要读取一个数据时,首先从Cache中查找...

  • 《Java并发编程的艺术》笔记

    一、挑战   上下文切换、死锁、资源的限制 二、Java并发机制的底层实现原理   原子性、可见性、顺序一致性 v...

  • java并发编程要点

    Java并发问题主要有三个核心概念:原子性,可见性,顺序性。 原子性 并发问题的原子性的概念和数据库事务的原子性是...

  • 并发编程总结

    并发概念 并发变成三大特性 原子性 可见性 有序性 区分数据库事务四大特性:原子性、一致性、隔离性、持久性 线程的...

  • java基础18-并发学习

    1.并发问题:可见性,原子性和有序性 cpu缓存会导致可见性,线程切换会导致原子性(count++不是原子的),编...

  • volatile关键字原理实现及应用

    1.并发编程中的三个概念 在并发编程中, 需要了解线程的三个概念:原子性,可见性,有序性: 1.1.原子性 原子性...

  • Java多线程

    01 |可见性、原子性和有序性问题:并发编程Bug的源头 原子性:线程切换导致原子性。 可见性:CPU缓存导致可见...

  • 第四篇 Java并发编程之volatile知多少

    一、并发编程的三个重要特性 原子性 有序性 可见性 原子性指一次或多次操作,要么都成功,要么都失败 有序性执行顺序...

  • 原子操作的底层实现原理及Java实现原理分析

    多线程并发编程需要解决的几个问题是原子性,可见性和顺序性,今天我们主要分析一下原子性的底层实现原理及上层java实...

  • 【漫画】JAVA并发编程 如何解决原子性问题

    在并发编程BUG源头文章中,我们初识了并发编程的三个bug源头:可见性、原子性、有序性。在如何解决可见性和原子性文...

网友评论

      本文标题:1.并发相关的原子性,可见性,顺序一致性,happen-befo

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