【发布时间】:2010-10-26 16:11:16
【问题描述】:
我刚刚意识到我需要在一个方面同步大量数据收集代码,但性能是一个真正的问题。如果性能下降太多,我的工具将被淘汰。我将分别编写整数和长整数以及各种数组、ArrayLists 和 Maps。应用程序的多个线程将进行函数调用,这些调用将被我的方面拾取。我应该注意哪些会对性能产生负面影响的事情?哪些代码模式更有效?
特别是我有一个调用许多其他数据记录方法的方法:
void foo() {
bar();
woz();
...
}
这些方法主要是增加方面字段的增量
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
}
}
【问题讨论】:
-
如果不知道你的每个方法做了什么,真的不可能回答这个问题。你甚至需要同步访问吗?哪些资源可能不是线程安全的?你在访问什么?等
-
你最后的 sn-p 没有意义。你永远不想在这样的本地创建的对象上进行同步。您同步的对象必须在其他线程中可见,否则没有意义。
-
对不起,这实际上应该是一个类字段,正在改变。该类实际上也是方面。
标签: java performance synchronization aspectj