Java多线程之先行发生原则(happens-before)

前面介绍了Java内存模型及内存屏障相关概念,这篇文章接着介绍多线程编程另外一个比较重要的概念:先行发生原则(happens-before)。

重要性

happens-before是判断数据是否存在竞争,线程是否安全的主要依据,通过这个原则,我们可以解决并发环境下两个操作之间是否可能存在冲突的所有问题。

happens-before是什么

它Java内存模型中针对两项操作定义的偏序关系。例如操作A先行于操作B发生,那么操作B可以观察到操作A所产生的所有影响,这些影响包括修改内存中共享变量的值、发送的消息,调用的方法等。

Java多线程之volatile关键字及内存屏障

前面一篇文章在介绍Java内存模型的三大特性(原子性、可见性、有序性)时,在可见性和有序性中都提到了volatile关键字,那这篇文章就来介绍volatile关键字的内存语义以及实现其特性的内存屏障。

volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性:可见性和有序性。正因为volatile关键字具有这两大特性,所以我们可以使用volatile关键字解决多线程中的某些同步问题。

volatile的可见性

volatile的可见性是指当一个变量被volatile修饰后,这个变量就对所有线程均可见。白话点就是说当一个线程修改了一个volatile修饰的变量后,其他线程可以立刻得知这个变量的修改,拿到最这个变量最新的值。

Java多线程之Java内存模型

在介绍Java内存模型之前,我们先介绍一下计算机硬件的内存模型,因为JVM的并发和物理机器的并发很相似,甚至JVM并发操作中很多设计都是因为计算机系统的设计引发的。

硬件的内存模型

大家都知道计算机系统处理任务主要是靠处理器(CPU)来进行运算的,而运算中又会涉及到数据,数据在哪呢,数据自然是存储在计算机内存中,所以处理器在运算过程中不可避免的会涉及到与内存的读写交互,比如读取运算所需的数据,存储运算得到的数据结果等。而处理器的运算速度相比物理内存的读写速度要快得多,所以会出现处理器要等待内存数据读写结束后才能进行下一步的运算,因此为了提高计算机的运算速度,现在的计算机系统为处理器添加了一层读写速度尽量接近处理器的高速缓存来缓解内存与处理器之间的性能差异。这样在处理任务时将运算需要的数据复制到缓存中,运算结束后再将数据从缓存中同步写回到内存,这样处理器在运算时就不需要等待内存数据读写结束了。

多线程之:Synchronized与ReentrantLock

什么是线程安全

  1. 保证多线程环境下共享的、可修改的状态的正确性。(这里的状态在程序中可以看作为数据)
  2. 反着来说则是如果状态非共享、不可修改,也就不存在线程安全的问题
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×