В настоящее время я читаю раздел о параллелизме в книге «Хорошо обоснованная Java-разработчик», и этот пример кода, демонстрирующий параллельность блоков, должен заходить в тупик, но, насколько я вижу, это не так. Вот код:Где тупик в этом примере?
public class MicroBlogNode implements SimpleMicroBlogNode {
private final String ident;
public MicroBlogNode(String ident_){
ident = ident_;
}
public String getIdent(){
return ident;
}
public static Update getUpdate(String _name){
return new Update(_name);
}
public synchronized void propagateUpdate(Update upd_, MicroBlogNode backup_){
System.out.println(ident + ": received: " + upd_.getUpdateText() + " ; backup: " + backup_.getIdent());
backup_.confirmUpdate(this, upd_);
}
public synchronized void confirmUpdate(MicroBlogNode other_, Update update_){
System.out.println(ident + ": received confirm: " + update_.getUpdateText() + " from " + other_.getIdent() + "\n");
}
public static void main(String[] args) {
final MicroBlogNode local = new MicroBlogNode("localhost");
final MicroBlogNode other = new MicroBlogNode("remotehost");
final Update first = getUpdate("1");
final Update second = getUpdate("2");
new Thread(new Runnable() {
public void run() {
local.propagateUpdate(first, other);
}
}).start();
new Thread(new Runnable() {
public void run() {
other.propagateUpdate(second, local);
}
}).start();
}
}
Когда я запускаю его я получаю следующий вывод:
localhost: received: 1 ; backup: remotehost
remotehost: received confirm: 1 from localhost
remotehost: received: 2 ; backup: localhost
localhost: received confirm: 2 from remotehost
В книге говорится, что если вы запустите код, вы обычно видите пример тупиковой ситуации, как потоки будут сообщать о получении обновления, но ни один из них не подтвердит получение обновления для , который является резервным потоком. Причина этого в том, что каждый поток требует, чтобы другой освободил блокировку, которую он удерживает, прежде чем способ подтверждения может прогрессировать.
Насколько я вижу, это не так - каждый поток подтверждает получение обновления, для которого они являются резервным потоком.
Заранее спасибо.
Вы уверены, что это пример из книги? Покажите нам класс «Обновить». –
Где находится метод getUpdateText? – wheaties