gpt4 book ai didi

java - 在 ConcurrentHashMap 中添加值时出现线程争用

转载 作者:行者123 更新时间:2023-11-30 04:28:46 26 4
gpt4 key购买 nike

我正在尝试计算多线程代码中发生的异常数量。为此,我创建了一种方法 addException,在其中使用 AtomicInteger 计算所有异常。

addException方法接受两个参数,一个是String,另一个是boolean flag,这意味着我们是否要终止程序或不是因为任何异常(exception)。意思是,如果该标志为真,那么每当出现任何异常时我都需要终止程序。

因此,如果您查看下面的 catch block ,我会调用 addException 方法来计算异常,并且在该方法调用下面我也会记录异常.

ExecutorService service = Executors.newFixedThreadPool(threads);

for (int i = 0; i < threads; i++) {
service.submit(new ReadTask());
}

class ReadTask implements Runnable {

public static ConcurrentHashMap<String, AtomicInteger> exceptionMap = new ConcurrentHashMap<String, AtomicInteger>();

public ReadTask() {

}

@Override
public run() {

try {

.........

} catch (ClassNotFoundException e) {
addException(e.getCause() != null ? e.getCause().toString() : e.toString(), Read.flagTerminate);
LOG.error("Threw a ClassNotFoundException in " + getClass().getSimpleName(), e);
} catch (SQLException e) {
addException(e.getCause() != null ? e.getCause().toString() : e.toString(), Read.flagTerminate);
LOG.error("Threw a SQLException while making connection to database in " + getClass().getSimpleName(), e);
}
}

/**
* A simple method that will add the count of exceptions and name of
* exception to a map
*
* @param cause
* @param flagTerminate
*/
private static void addException(String cause, boolean flagTerminate) {
AtomicInteger count = exceptionMap.get(cause);
if (count == null) {
count = new AtomicInteger();
AtomicInteger curCount = exceptionMap.putIfAbsent(cause, count);
if (curCount != null) {
count = curCount;
}
}
count.incrementAndGet();

if(flagTerminate) {
System.exit(1);
}
}
}

问题陈述:-

此代码是否可能存在线程争用?如果是,我怎样才能以更好的方式编写addException方法来避免线程争用

这里有没有更高效的方式来编写addException方法?

最佳答案

您的代码看起来逻辑上是正确的,但仍然存在线程争用的可能性。

考虑一下如果每个线程抛出相同的异常会发生什么:它们将在更新 AtomicInteger 时进行序列化,以跟踪异常计数。

确实没有简单的方法来解决这个问题:如果所有线程都更新同一 block 数据,那么它们几乎必须序列化。这不是问题;这就是现实。

方法可以解决这个问题,但这会将一段简单、正确的代码变成一场复杂的噩梦。

您应该问的问题是“我需要提高效率吗?”答案很可能是否定的,因为根据定义,异常(exception)情况几乎是罕见的。仅当上一个问题的答案为"is"时,才应提出“如何如何提高效率”的问题。

关于java - 在 ConcurrentHashMap 中添加值时出现线程争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com