Java方面的同步和性能

nas*_*ash 5 java performance synchronization aspectj

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

特别是我有一种方法可以调用许多其他数据记录方法:

void foo() {
    bar();
    woz();
    ...
}
Run Code Online (Sandbox Code Playgroud)

这些方法主要是添加方面字段的递增

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
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

我应该单独同步foo,bar,woz和其他人,还是应该将bar,woz等中的所有代码移动到foo中并同步它?我应该this在特定创建的同步对象上进行同步:

private final Object syncObject = new Object();
Run Code Online (Sandbox Code Playgroud)

(参见这篇文章),或方法中的个别数据元素:

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

void bar() {    
    synchronize(a) {
        // synchronized code
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*rne 9

并发非常棘手.这很容易弄错,而且很难做对.在这一点上,我不会过于担心表现.我首要关心的是让并发代码安全地工作(没有死锁或竞争条件).

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

如今,Java有很多很棒的分析工具.Netbeans和Eclipse分析器很好.

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

另外,我建议你阅读Brian Goetz等人的Java Concurrency in Practice.它编写得很好,涵盖了很多方面.