gpt4 book ai didi

Java同步和性能方面

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:36 25 4
gpt4 key购买 nike

我刚刚意识到我需要在一个方面同步大量的数据收集代码,但性能是一个真正的问题。如果性能下降太多,我的工具就会被淘汰。我将单独编写 int 和 long 以及各种数组、ArrayList 和 Maps。一个应用程序将有多个线程进行函数调用,这些函数调用将由我的方面获取。我应该注意哪些会对性能产生负面影响的事情?哪些代码模式更有效?

特别是我有一个调用许多其他数据记录方法的方法:

void foo() {
bar();
woz();
...
}

这些方法主要是添加 aspect 字段的增量

void bar() {
f++; // f is a field of the aspect
for (int i = 0; i < ary.length; i++) {
// get some values from aspect point cut
if (some condiction) {
ary[i] += someValue; // ary a field of the aspect
}
}
}

我应该单独同步 foo 或 bar、woz 等,还是应该将 bar、woz 等中的所有代码移到 foo 中并只同步它?我应该在 this 上同步,在一个专门创建的同步对象上:

private final Object syncObject = new Object();

(参见 this 帖子),或方法中的单个数据元素:

ArrayList<Integer> a = new ArrayList<Integer>();

void bar() {
synchronize(a) {
// synchronized code
}
}

最佳答案

并发非常棘手。做错很容易,做对很难。在这一点上,我不会太担心性能。我最关心的是让并发代码安全地工作(没有死锁或竞争条件)。

但是关于性能的问题:有疑问,profile。很难说不同的同步方案将如何影响性能。我们更难给你建议。我们需要查看更多您的代码并更深入地了解应用程序的作用,才能为您提供真正有用的答案。相比之下,分析为您提供确凿的证据,证明一种方法是否比另一种方法慢。它甚至可以帮助您确定减速的位置。

现在有很多很棒的 Java 分析工具。 Netbeans 和 Eclipse 分析器都很好。

此外,我建议完全远离原始同步。尝试使用 java.util.concurrency 包中的一些类。它们使编写并发代码变得更加容易,并且更不容易出错。

此外,我建议您阅读 Java Concurrency in Practice由 Brian Goetz 等人撰写。它写得很好,涵盖了很多领域。

关于Java同步和性能方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/871582/

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