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)
并发非常棘手.这很容易弄错,而且很难做对.在这一点上,我不会过于担心表现.我首要关心的是让并发代码安全地工作(没有死锁或竞争条件).
但是在性能问题上:当有疑问时,简介.很难说同步方案将如何影响性能.我们更难给你建议.我们需要查看更多代码,并深入了解应用程序的功能,为您提供真正有用的答案.相比之下,分析为您提供了关于一种方法是否比另一种方法慢的确凿证据.它甚至可以帮助您确定减速的位置.
如今,Java有很多很棒的分析工具.Netbeans和Eclipse分析器很好.
另外,我建议完全远离原始同步.尝试使用java.util.concurrency包中的一些类.它们使编写并发代码变得更加容易,并且更不容易出错.
另外,我建议你阅读Brian Goetz等人的Java Concurrency in Practice.它编写得很好,涵盖了很多方面.
| 归档时间: |
|
| 查看次数: |
4222 次 |
| 最近记录: |