【发布时间】:2014-03-30 20:51:10
【问题描述】:
我正在尝试创建一个小基准(在 Groovy 中),以显示几个同步方法上的高线程争用。在监视自愿上下文切换时应该会出现高争用,而在 Linux 中,这可以通过“pidstat”来实现。
程序如下:
class Res {
private int n;
synchronized public void inc() {
n++;
def foo = []
for (int i = 0; i < 1000; ++i) foo << "hello"
}
synchronized public int getN() {
return n;
}
}
while (true) {
Res res = new Res()
int N = 100000
for (int i = 0; i < N; ++i) {
new Thread({
res.inc()
if (res.getN() == N) {
println "ok"
}
}).start()
}
while (res.getN() < N) {
}
println "========================="
}
但是命令
pidstat -w -I -p 26848 5
在自愿上下文切换列上打印 0。该程序创建了 100000 个并发访问同步方法的线程。我不敢相信在这样的工作量下,没有发生上下文切换。
我的基准有什么问题?
【问题讨论】:
-
你可以试试新的Oracle Mission Control。如果您将您的应用程序挂接到flight recorder,您应该会获得有关锁争用的数据。
标签: java multithreading jvm locking