gpt4 book ai didi

java - PriorityBlockingQueue 阻塞时间过长

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:06 41 4
gpt4 key购买 nike

我正在使用 PriorityBlockingQueue 来存储功能的 tf-idf 分数。由于这部分是多线程的,我使用 synchronized block 来处理并发性:

long ticAdd = 0;
long tocAdd = 0;
long ticPoll = 0;
long tocPoll = 0;
long ticAll = System.nanoTime();

PriorityBlockingQueue<TfIdfScore> allScores = sharedFeatureNameToScores.get(featureName);

// ..

synchronized (allScores) {

ticAdd = System.nanoTime();
allScores.add(instanceScore);
tocAdd = System.nanoTime();

int allScoresSize = allScores.size();

ticPoll = System.nanoTime();
while( allScoresSize > scoresToKeepCount) {
allScores.poll();
allScoresSize = allScores.size();
}
tocPoll = System.nanoTime();

long tocAll = System.nanoTime();

if( ((tocAll - ticAll) /(1e6)) > 10 ) {
System.out.println("---\nallScores.size " + allScores.size());
System.out.println("add duration: " + ((tocAdd - ticAdd) /(1e6)) + "ms");
System.out.println("poll duration: " + ((tocPoll - ticPoll) /(1e6)) + "ms");
System.out.println("overall duration: " + ((tocAll - ticAll) /(1e6)) + "ms");
}
} // end synchronized

问题是,有时这似乎会阻塞很长一段时间,我只是不明白为什么会出现这种情况。队列不是很大,但正如您在我的输出中看到的那样,它阻塞的时间相当长(有时):

---
allScores.size 471
add duration: 3.34E-4ms
poll duration: 12.02297ms
overall duration: 12.023402ms
---
allScores.size 471
add duration: 3988.91183ms <===
poll duration: 0.002303ms
overall duration: 3988.915091ms
--
allScores.size 471
add duration: 4.69E-4ms
poll duration: 4002.275955ms <===
overall duration: 4002.276525ms

为什么会发生这种情况?你可以想象这会大大减慢我的程序速度..

另一件奇怪的事情是,有时add部分和有时poll部分需要更长的时间。

最佳答案

我建议删除对象监视器上的同步,而不是要求您依赖使用 ConcurrentLinkedQueue 包装或使用 synchronizedCollection(Collection c) 的同步。

这可能会减少使用通用对象锁定时的阻塞延迟。

关于java - PriorityBlockingQueue 阻塞时间过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401531/

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