2015-03-07 3 views
-1

Мне задали вопрос из одной из моих опросов вопроса: Задача использует основной поток (не показан здесь), чтобы разделить работу сканирования ДНК между несколькими потоками. * Мастер-поток вызывает метод scanDNA (ниже) для всех остальных потоков одновременно, причем каждый поток * снабжен собственной личной долей работы (dnaList, индивидуально для каждого потока).
* * Каждый поток разделяет общий объект «результаты» как способ сообщить о ходе сканирования главному * теме задачи. Для задачи очень важно, чтобы общее количество успешных сканирований было * всегда точным. * * Улучшите общую производительность задачи, изменив метод scanDNA ниже и устраните любые дефекты. */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)); 
       } 
      } 
     } 
    } 
} 

Я не могу понять эту проблему, я бы очень благодарен за решение этого из

+0

как полный подсчет сканирования будет точным? –

ответ

2

При синхронизации через results объекта в самом начале работы нити thave ждать друг друга, это они будут выполнять свой рабочий синхронный, а не параллельный. Поскольку входные данные для каждого потока уникальны для потока, они должны сначала вычислить результат (без синхронизации), и если результат доступен, используйте синхронизацию вокруг results и обновите его. Таким образом, замок становится как можно короче. Сам объект lock кажется бесполезным, поскольку каждый поток создает свою собственную переменную для внешнего вида.