regardant http://download.eclipse.org/jetty/stable-7/xref/com/acme/ChatServlet.html, je ne semble pas comprendre pourquoi il doit y avoir un bloc de synchronisation dans une méthode synchronisée, comme suit:aide de synchronisation en Java
private synchronized void chat(HttpServletRequest request,HttpServletResponse response,String username,String message)
throws IOException
{
Map<String,Member> room=_rooms.get(request.getPathInfo());
if (room!=null)
{
// Post chat to all members
for (Member m:room.values())
{
synchronized (m)
{
m._queue.add(username); // from
m._queue.add(message); // chat
// wakeup member if polling
if (m._continuation!=null)
{
m._continuation.resume();
m._continuation=null;
}
}
}
}
Pourquoi m
doivent être synchronisées (encore une fois ?) si toute la méthode est déjà thread-safe?
Nous vous remercions de votre compréhension.
Merci, je comprends, mais juste par curiosité ... pourquoi l'objet _rooms n'est-il pas également synchronisé? –
Probablement parce que _rooms est seulement modifié par d'autres méthodes synchronisées dans la même classe, aussi longtemps que vous y accédez dans une méthode synchronisée, vous pouvez être sûr que personne ne l'ajoute ou en supprime des éléments. Idéalement, il serait défini comme «privé» car, à l'heure actuelle, il est paquet-privé, ce qui signifie que toutes les autres classes du paquet (ou sous-classes) pourraient y accéder. –
Merci pour votre commentaire, mais alors je dois revenir à ma question initiale. Pourquoi synchroniser 'm' est-il nécessaire? Il est seulement utilisé dans des méthodes déjà synchronisées (un peu comme _rooms). Ou synchroniser 'm' juste une précaution? –