Sortez du bloc synchronisé?

user5047085:

J'ai ceci:

synchronized(c){
   if (!items.hasNext() && (c.getFinishedCount() == c.getStartedCount())) {
      f.done(null, results);
      return;
    }

    if(c.isBelowCapacity()){
      RunMap(items,m,results,c,s,f);
    }
}

mais finalement je ne dois pas être synchronisé sur c quand je l' appelle RunMap()ou f.done(), je dois juste être synchronisé sur c quand je fais les contrôles conditionnels / si les déclarations.

Dois-je faire les méthodes sur c synchronisées, puis se débarrasser du bloc synchronisé?

TreffnonX:

Dois-je faire les méthodes sur c synchronisées, puis se débarrasser du bloc synchronisé?

Non, la meilleure façon est de faire les contrôles dans le bloc synchronisé, puis le reste du travail plus tard:

boolean bFDone = false;
boolean bRunMap = false;

synchronized (c) {
    bFDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
    bRunMap = !bFDone && c.isBelowCapacity();
}

if (bFDone) {
    f.done(null, results);
} else if (bRunMap) {
    RunMap(items,m,results,c,s,f);
}

Le gros avantage de cette version est que tout le code volatile est réellement synchronisé, et le reste des choses (potentiellement lent) arrive plus tard.

Comme il est mentionné correctement dans les commentaires à cette réponse, cela ne fonctionne que correctement, si votre hypothèse initiale est correcte, que le bloc entier ne synchronisation pas besoin. Si vous avez besoin de réagir aux conditions immédiatement, le bloc doit être en fait synchronisé (entièrement).

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=186189&siteId=1
conseillé
Classement