Java教程

二、并发编程的三大特性

本文主要是介绍二、并发编程的三大特性,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

可见性(visibility)

  • 申明的变量会放在内存中,一个线程更改之后,之前获取值的线程是对这个变量不可见的

  • volatile 可以保证变量的可见性,引用类型(包括数组)只能保证本身的可见性,不能保证内部字段的可见性

  • 数据的读取顺序是从cpu的计算机单元寄存器->L1 -> L2 -> L3 ->内存,最终在各个阶段存储一份

    • 对于线程的可见性是值得L1,L2,L3的可见性
  • cpu多级缓存如下图所示:
    在这里插入图片描述

  • 缓存一致性协议 MESI Cache

状态描述监听任务
修改 (Modified)该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。
独享、互斥 (Exclusive)该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。
共享 (Shared)该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。
无效 (Invalid)该Cache line无效。
  • 缓存行(大多数的64byte)
    • cpu每次访问主存时都会读取至少一个缓存行的数据 (通常一个缓存行为64字节,哪怕读取4字节数据,也会连续读取该数据之后的60字节)。这样做是为了加快数据访问速度
    • 缓存行越大,局部性空间效率越高,读取时间慢
    • 缓存行越小,局部性空间效率越低,读取时间快

有序性(ordering)

  • 表现在 程序顺序源代码顺序不一致 或者 执行顺序程序顺序 不一致
  • cpu指令可能是乱序的
    • 前后两条语句没有依赖性可能会乱序执行
    • 乱序执行是为了提高cpu的执行效率
    • 发生时刻:在不影响单线程的最终一致性发生(as -if -serial)

原子性(atomicity)

  • race condition => 竞争条件,指的是多个线程访问共享数据的时候产生竞争
  • 数据不一致,并发访问之下产生的不期望出现的结果
  • 如何保障数据的一致
    • 线程同步(线程执行的顺序要有序)
  • 即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
  • 保证原子性的操作
    • 悲观锁 synchronized
    • 乐观锁 cas
这篇关于二、并发编程的三大特性的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!