【每日阅读】2020年11月23日-Java如何解决了有序性和可见性

有疑问就留言给我吧😄

昨天的文章说的是高并发都会遇到的问题,今天说说Java是如何解决的。

一句话说,就是Java是通过内存模型解决有序性和可见性的。解决这两个问题需要禁用缓存以及禁用编译优化,内存模型就是指导JVM按需禁用缓存以及按需禁用编译优化的。

在Java内具体来说就是volatile、synchronized、final以及6个happens-before原则。

volatile

对一个变量,必须从内存中读写。即禁用了缓存。

happens-before

  1. 单线程中,前面的操作 Happens-Before 于后续的任意操作。
  2. 对一个 volatile 变量的写操作, Happens-Before 于后续对这个 volatile 变量的读操作。
  3. 传递性,a happens-before b, b happens-before c,则a happens-before c
  4. 管程中锁的规则:对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。管程是一种通用的同步原语,在 Java 中指的就是 synchronized,synchronized 是 Java 里对管程的实现。
  5. 这条是关于线程启动的。它是指主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。
  6. 这条是关于线程等待的。它是指主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作。

原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2704

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

GitHub
分享本页
返回顶部