File tree Expand file tree Collapse file tree 1 file changed +4
-3
lines changed
Filter options
Expand file tree Collapse file tree 1 file changed +4
-3
lines changed
Original file line number Diff line number Diff line change @@ -24,16 +24,17 @@ synchronized (mon) { mon.notify(); }
24
24
如果有多个线程在等待(且` synchronized ` 锁对象是同一个,如上例中的mon),则可以调用[ ` notifyAll ` ] ( http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#notifyAll%28%29 ) 来唤醒。但是,只有其中一个线程能抢到锁并继续执行(因为 ` wait ` 的线程都是在 ` synchronized ` 块内,需要争夺 ` synchronized ` 锁)。其他的线程会被锁住,直到他们依次获得锁。
25
25
26
26
再补充几点:
27
- 1 . ` wait ` 方法由 ` Object ` 对象调用(例如:你可以让 ` synchronized ` 锁对象调用 ` wait ` ,如上面例子的mon.wait()),而 ` sleep ` 则由线程调用。
28
27
29
- 2 . ` wait ` 之后,可能会伪唤醒(` spurious wakeups ` )(正在waiting的线程,无故就被唤醒了,如遇到interrupted, timing out等情况)。因此,你需要多设置一些检查,如果不满足实际的运行条件,则继续等待,如下:
28
+ - ` wait ` 方法由 ` Object ` 对象调用(例如:你可以让 ` synchronized ` 锁对象调用 ` wait ` ,如上面例子的mon.wait()),而 ` sleep ` 则由线程调用。
29
+
30
+ - ` wait ` 之后,可能会伪唤醒(` spurious wakeups ` )(正在waiting的线程,无故就被唤醒了,如遇到interrupted, timing out等情况)。因此,你需要多设置一些检查,如果不满足实际的运行条件,则继续等待,如下:
30
31
```
31
32
synchronized {
32
33
while (!condition) { mon.wait(); }
33
34
}
34
35
```
35
36
36
- 3 . 当线程调用 ` sleep ` 时,并没有释放对象锁,而 ` wait ` 则释放了对象锁:
37
+ - 当线程调用 ` sleep ` 时,并没有释放对象锁,而 ` wait ` 则释放了对象锁:
37
38
```
38
39
synchronized(LOCK) {
39
40
Thread.sleep(1000); // LOCK is held
You can’t perform that action at this time.
0 commit comments