Je viens de .NET
monde, et malheureusement la source de Java avec les yeux de .NET
.Jeux de synchronisation Java: synchronisation && wait && notifier
code suivant est d'Android Apps (mais pas Android spécifique du tout):
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();
}
}
Je ne suis pas exactement clair avec la façon dont fonctionne synchronized
. D'abord je pensais que synchronized verrouille l'objet mLock, mais si après thread t.start()
constructeur entre d'abord le bloc de synchronisation, il le bloquerait à mLock.wait()
, et bloquerait implicitement le fil "t" en le bloquant d'entrer le bloc synchronisé.
Ceci est évidemment faux, parce que mon téléphone sonne comme on le suppose :)
pensée suivante est que Synchronize synchronise « bloc de code » (dans ce cas, il deux blocs synchronisés sont des threads indépendants => peuvent entrer dans deux de synchronisation différents bloquer en même temps sans restriction), et cela correspond parfaitement ...
... jusqu'à ce que mon collègue me dise que les versions mLock.wait()
se verrouillent sur mLock et permettent aux autres threads d'entrer dans la section critique sur mLock en même temps.
Je ne suis pas sûr d'avoir été assez clair, donc je répondrai volontiers à d'autres questions à ce sujet.
Première question: quelle est votre question? – erickson
Comment fonctionne ce code? :) – Jox