锁的释放和获取的内存语义
操作 | 锁的释放和获取的内存语义 | 类比volatile | 对锁释放和锁获取的内存语义做个总结 |
---|---|---|---|
当线程释放锁时 | JMM会把该线程对应的本地内存中的共享变量刷新到主内存中 | 锁释放与 volatile写 有相同的内存语义 | 线程A释放一个锁,实质上是线程A向接下来将要获取这个锁的某个线程发出了(线程A对共享变量所做修改的)消息。 |
当线程获取锁时 | JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量 | 锁获取与 volatile读 有相同的内存语义 | 线程B获取一个锁,实质上是线程B接收了之前某个线程发出的(在释放这个锁之前对共享变量所做修改的)消息 |
线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A通过主内存向线程B发送消息 |
Java线程间通信的4种方式
Java线程间通信的4种方式 |
---|
1)A线程写volatile变量,随后B线程读这个volatile变量。 |
2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。 |
3)A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。 |
4)A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。 |