Я из мира .NET
и, к сожалению, ищу источник Java глазами .NET
.
Следующий код взят из приложений для 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()
поток конструктора сначала войдет в блок синхронизации, он заблокирует его при mLock.wait()
и неявно заблокирует поток «t», заблокировав его вход в синхронизированный блок.
Это явно не так, потому что мой телефон звонит как положено:)
Следующая мысль заключается в том, что синхронизация синхронизирует «кодовый блок» (в этом случае два синхронизированных блока являются независимыми => потоки могут одновременно вводить два разных блока синхронизации без ограничений), и это идеально подходит ...
... пока мой коллега не сказал мне, что mLock.wait()
снимает блокировку на mLock и позволяет другому потоку одновременно входить в критическую секцию на mLock.
Я не уверен, что был достаточно ясен, поэтому с удовольствием отвечу на любые дополнительные вопросы по этому вопросу.