java内存模型
规范了jvm如何按需提供禁用缓存和编译优化的方法
具体操作:按需禁用缓存,禁用编译优化。 关键字: volatile(禁用cpu缓存) synchronized final
Happens-Before表达的是:前面一个操作的结果对后续操作是可见的
管程 是一种通用的同步原语,在 Java 中指的就是 synchronized,synchronized 是 Java 里对管程的实现
具体包含6条规则:
1、程序的顺序性规则
2. volatile 变量规则
3. 传递性
4. 管程中锁的规则 这条规则是指对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。
5. 线程 start() 规则 它是指主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。
6. 线程 join() 规则 它是指主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作
final 修饰变量时,初衷是告诉编译器:这个变量生而不变,可以可劲儿优化
可见性 缓存导致可见性问题
有序性 编译优化导致有序性问题
原子性 cpu指令执行不被中断,叫做原子性。问题源头在于线程切换
“同一时刻只有一个线程执行”这个条件非常重要,我们称之为互斥
需要互斥执行的代码称为临界区
Java 语言提供的锁技术:synchronized (锁的一种实现)
class X {
// 修饰非静态方法
synchronized void foo() {
// 临界区
}
// 修饰静态方法
synchronized static void bar() {
// 临界区
}
// 修饰代码块
Object obj = new Object();
void baz() {
synchronized(obj) {
// 临界区
}
}
}