我来自 .NET
世界,不幸的是用 .NET
的眼光看 Java 源代码。
以下代码来自 Android 应用程序(尽管根本不是特定于 Android 的):
private class Worker implements Runnable {
private final Object mLock = new Object();
private Looper mLooper;
Worker(String name) {
Thread t = new Thread(null, this, name);
t.start();
synchronized (mLock) {
while (mLooper == null) {
try {
mLock.wait();
} catch (InterruptedException ex) {
}
}
}
}
public Looper getLooper() {
return mLooper;
}
public void run() {
synchronized (mLock) {
Looper.prepare();
mLooper = Looper.myLooper();
mLock.notifyAll();
}
Looper.loop();
}
public void quit() {
mLooper.quit();
}
}
我不是很清楚 synchronized
是如何工作的。
一开始我以为synchronized是锁定mLock对象,但是如果t.start()
构造线程先进入同步块(synchronized block),它会阻塞在mLock.wait()
,并通过阻止线程“t”进入同步块(synchronized block)来隐式阻止线程“t”。
这显然是错误的,因为我的电话响了 :)
接下来想到的是 synchronize 同步“代码块”(在这种情况下,两个同步块(synchronized block)是独立的 => 线程可以不受限制地同时进入两个不同的同步块(synchronized block)),并且非常适合...
... 直到我的同事告诉我 mLock.wait()
释放了 mLock 上的锁并使其他线程同时进入 mLock 上的临界区。
我不确定我是否足够清楚,所以很乐意回答有关此的任何进一步问题。
最佳答案
查看 Object.wait() 上的 javadoc .它的“魔力”在于它删除了进入同步 {} block 时获取的监视器。这允许另一个线程获取监视器并调用 Object.notify() .
当另一个线程调用 notify() 将等待线程从其 wait() 调用中唤醒时,等待线程必须重新获取监视器并将阻塞直到它可以——监视器仅在等待期间被丢弃() 称呼。并且通知线程在新唤醒的等待线程可以继续之前完成其同步块(synchronized block)。一切都按照可预测的顺序进行。
关于Java 同步游戏 : synchronized && wait && notify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1922224/