索引
昨天的文章说的是高并发都会遇到的问题,今天说说Java是如何解决的。
一句话说,就是Java是通过内存模型解决有序性和可见性的。解决这两个问题需要禁用缓存以及禁用编译优化,内存模型就是指导JVM按需禁用缓存以及按需禁用编译优化的。
在Java内具体来说就是volatile、synchronized、final以及6个happens-before原则。
volatile
对一个变量,必须从内存中读写。即禁用了缓存。
happens-before
- 单线程中,前面的操作 Happens-Before 于后续的任意操作。
- 对一个 volatile 变量的写操作, Happens-Before 于后续对这个 volatile 变量的读操作。
- 传递性,a happens-before b, b happens-before c,则a happens-before c
- 管程中锁的规则:对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。管程是一种通用的同步原语,在 Java 中指的就是 synchronized,synchronized 是 Java 里对管程的实现。
- 这条是关于线程启动的。它是指主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。
- 这条是关于线程等待的。它是指主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作。
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2704