跳转至

Java 并发

时间:2019/4/6 17:45:25

参考:

  1. Java 并发编程实战。

说明:用一篇文章总结Java并发相关知识。

并发简介#

Java使用共享内存解决线程之间数据共享和同步的问题。

在多核处理器中,每个 都有自己的缓存区(L1、L2、L3)。由于缓存的存在,会出现不同线程缓存的数据不一致的情况,给并法编程带来了缓存不一致的问题。使用内存屏障可以强制把缓存的数据写入到内存或者标记其它缓存中的数据为失效状态。从而解决缓存导致的数据不一致的问题。

由于重排序的存在导致代码执行的顺序和实际编写的代码顺寻并不一致,因此在多线程程序中可能出现和预期不一致的执行效果。

基本概念#

  • 指令重排序:编译器对没有依赖关系的语句的操作顺序进行重排序,从而提高运行效率。
  • 内存可见性:在一个线程中更新变量的内容,在其它线程中读取变量,读取到的一定是更新后的内容。
  • 内存屏障:多核CPU的计算机上,每个CPU都有自己的缓存(L1、L2、L3)等,缓存中的数据和
  • Happens before:一个操作发生在另一个操作之前。保证内存的可见性。
    • sychronized: 前一个获取锁的同步块儿在之后的一个获取锁的同步块儿之前执行。
    • volatilevolatile 写操作发生在之后的 volatile 变量的读操作之前。
  • 原子性:不可分割的一个或一组操作。

Java 并发#

在 Java 中可以通过锁(隐式锁 sychronized 和显示锁 lock)来确保锁定代码块儿的原子性和内存可见性。

通过 volatile 可以确保变量的内存可见性,但不能确保原子性。volatile 类型变量的加加操作并不是原子的。