2015-03-07 1 views
-1

J'ai reçu une question d'un de mes quiz d'interview la question suivante: Une tâche utilise un fil principal (non montré ici) pour partager le travail de numérisation de l'ADN entre plusieurs threads. * Le thread principal invoque la méthode scanDNA (ci-dessous) sur tous les autres threads en même temps, chaque thread * disposant de son propre partage privé du travail (le dnaList, individuel à chaque thread).
* * Chaque thread partage l'objet 'results' commun afin de signaler la progression de l'analyse au thread maître * de la tâche. Il est très important pour la tâche que le nombre total d'analyses réussies soit * toujours précis. * * Améliorez les performances globales de la tâche en modifiant la méthode scanDNA ci-dessous et en corrigeant les éventuels défauts. */java multithreading program 4

private interface DNA { 
    public boolean scan(); 
} 

public void scanDNA(List<DNA> dnaList, Properties results) { 

    synchronized (results) { 
     Iterator<DNA> i = dnaList.iterator(); 

     Object lock = new Object(); 
     while (i.hasNext()) { 

      if (i.next().scan()) { 
       String key = "Successful Scans Performed"; 
       synchronized (lock) { 
        results.setProperty(key, 
          String.valueOf(Integer.valueOf(results.getProperty(key)) + 1)); 
       } 
      } 
     } 
    } 
} 

Je ne comprends pas ce problème, je remercie vraiment pour résoudre ceci

+0

comment le compte total de l'analyse sera-t-il exact? –

Répondre

2

En synchronisant via l'objet results au début du travail les fils Thave attendre les uns des autres, ce Est-ce qu'ils feront leur travail synchronisé au lieu de parallèle. Étant donné que les données d'entrée de chaque thread sont propres au thread, elles doivent d'abord calculer le résultat (sans synchronisation) et, si le résultat est disponible, utiliser la synchronisation autour du results et le mettre à jour. Donc, le verrou devient aussi court que possible. L'objet lock lui-même semble être inutile puisque chaque thread crée sa propre variable pour le look.