java多线程程序4

java多线程程序4,java,multithreading,Java,Multithreading,我在一次面试中被问到一个问题 问题如下: 任务使用主线程(此处未显示)在多个线程之间共享扫描DNA的工作。 *主线程一次调用所有其他线程上的Scanna方法(如下),每个线程 *线程提供了自己的工作私有共享(数据列表,每个线程单独使用)。 * *每个线程共享公共“结果”对象,作为向主线程报告扫描进度的一种方式 *任务的线程。对于任务来说,成功扫描的总数是非常重要的 *总是准确的。 * *通过修改下面的Scanna方法并修复任何缺陷,提高任务的总体性能。 */ 私有接口DNA{ 公共布尔扫描(

我在一次面试中被问到一个问题 问题如下: 任务使用主线程(此处未显示)在多个线程之间共享扫描DNA的工作。 *主线程一次调用所有其他线程上的Scanna方法(如下),每个线程 *线程提供了自己的工作私有共享(数据列表,每个线程单独使用)。
* *每个线程共享公共“结果”对象,作为向主线程报告扫描进度的一种方式 *任务的线程。对于任务来说,成功扫描的总数是非常重要的 *总是准确的。 * *通过修改下面的Scanna方法并修复任何缺陷,提高任务的总体性能。 */

私有接口DNA{
公共布尔扫描();
}
公共空间扫描(列表数据列表、属性结果){
已同步(结果){
迭代器i=dnaList.Iterator();
对象锁=新对象();
while(i.hasNext()){
如果(i.next().scan()){
String key=“已执行成功的扫描”;
已同步(锁定){
results.setProperty(键,
String.valueOf(Integer.valueOf(results.getProperty(key))+1));
}
}
}
}
}

我无法理解这个问题,我真的非常感谢您通过
结果
对象进行同步来解决这个问题。在工作开始时,线程彼此等待,这是因为它们将同步而不是并行地完成工作。 由于每个线程的输入数据对于该线程来说是唯一的,因此它们应该首先计算结果(无需同步),如果结果可用,则使用
结果周围的同步化
,并对其进行更新。所以锁变得尽可能短。
lock
对象本身似乎没有用,因为每个线程都为外观创建自己的变量。

扫描的总计数如何准确?
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));
                }
            }
        }
    }
}