La Javadoc pour AsynchronousByteChannel.read() indique que l'opération a lieu de manière asynchrone, mais que se passe-t-il lorsque la fin du flux a été atteinte? Une implémentation est-elle autorisée à déclencher le gestionnaire de complétion dans le même thread qui a appelé read()? Du point de vue de la mise en œuvre, il n'y a aucune raison d'effectuer cette opération de manière asynchrone, car nous connaissons déjà le résultat. De même, si un utilisateur tente de lire dans un ByteBuffer où remaining() renvoie 0, nous savons que l'opération de lecture doit renvoyer 0.Implications Threading de AsynchronousByteChannel
Je demande parce que j'ai rencontré une condition de concurrence dans ma propre implémentation AsynchronousByteChannel. J'appelle un gestionnaire d'achèvement qui appelle notify() sur lui-même lorsque l'opération se termine. J'invoque alors le code utilisateur suivant:
CompletionHandler<?, ?> handler = ...;
synchronized (handler)
{
asyncByteChannel.read(handler);
handler.wait();
}
Notez que l'utilisateur est en supposant que le gestionnaire sera informé lorsque l'opération est terminée, mais parce que lire() Invoque fait l'achèvement-gestionnaire synchrone, il est notifié avant attente() et ce dernier bloquera pour toujours.
La spécification nécessite-t-elle que Update CompletionHandler soit mis à jour dans un thread distinct ou les utilisateurs doivent-ils être conscients du fait que le thread qui appelle read() peut effectuer certaines opérations de manière synchrone?
Son modèle d'enfilage est un gâchis. Le javadoc sur le groupe asynchrone est impossible à analyser. Threading devrait être laissé aux développeurs - c'est la partie facile.Malheureusement, ils ont décidé de nous aider à ce sujet. Le résultat est très compliqué, non intuitif, mal documenté (parce qu'ils ne peuvent pas expliquer le désordre). Un examinateur occasionnel pourrait trouver l'API bien - en effet, pourquoi devrait-il être difficile? Mais quand on construit sérieusement une application sur le dessus, les complexités vont le rendre fou. – irreputable