diff --git "a/notes/programming/\347\256\241\347\250\213\346\250\241\345\236\213.md" "b/notes/programming/\347\256\241\347\250\213\346\250\241\345\236\213.md" index 2685a4e..933f3c9 100644 --- "a/notes/programming/\347\256\241\347\250\213\346\250\241\345\236\213.md" +++ "b/notes/programming/\347\256\241\347\250\213\346\250\241\345\236\213.md" @@ -37,7 +37,7 @@ date modified: 2022-05-30, 17:26:32 - Hoare 模型 - **MESA 模型** - 在上面两种模型中,当 `A notify B`,B 线程会立即执行,即当 B 线程执行时,之前导致 B 阻塞的条件一定得到了满足,B 只需继续执行即可 - - 在 MESA 模型中,当 `A notify B`,B 线程只是从条件等待队列移入入口等待队列,由于在 B 执行之前可能有其他线程进入管程改变了条件(synchronized 为非公平锁),故 B 执行时还需要再次判断条件。(即 [[Java 中为什么 wait() 要放在循环里使用]] 的原因之一) + - 在 MESA 模型中,当 `A notify B`,B 线程只是从条件等待队列移入入口等待队列,需要和其他线程竞争锁,有可能发生:在 B 执行之前可能有其他线程进入管程改变了条件,故 B 执行时还需要再次判断条件。(即 [[Java 中为什么 wait() 要放在循环里使用]] 的原因之一) - ![MESA 管程模型](https://pic-bed-615.oss-cn-beijing.aliyuncs.com/CleanShot%202022-06-07%20at%2018.55.16.png) 只有在 MESA 模型中提供了 `notifyAll`,另外两种模型中因为线程被唤醒后立马执行,提供不了 `notifyAll` 方法。