【发布时间】:2013-09-03 17:33:58
【问题描述】:
我有多个线程正在运行,需要附加到同一个队列。这个队列被分成多个变量,所以有效地,我正在调用一个函数,该函数在某个位置 i 处附加到每个变量。从http://www.youtube.com/watch?v=8sgDgXUUJ68&feature=c4-overview-vl&list=PLBB24CFB073F1048E 显示,我为每种方法添加了锁,如此处所示。 http://www.caveofprogramming.com/java/java-multiple-locks/ 。为数组中的 100,000 个对象创建锁似乎并不有效。在java中,假设我有一个管理大量对象队列的对象。如何正确同步 addToQueue,而不会通过同步方法而牺牲性能,只是我要附加到的 floatQueue 和 intQueue 中的位置?
class QueueManager {
private float[] floatQueue;
private int[] intQueue;
private int currentQueueSize;
private int maxQueueSize;
QueueManager(int sizeOfQueue) {
intQueue = new int[sizeOfQueue];
floatQueue = new float[sizeOfQueue];
currentQueueSize = 0;
maxQueueSize = sizeOfQueue;
}
public boolean addToQueue(int a, float b) {
if (currentQueueSize == maxQueueSize) {
return false;
}
else{
intQueue[currentQueueSize] = a;
floatQueue[currentQueueSize] = b;
currentQueueSize++;
return true;
}
}
}
【问题讨论】:
-
我想到的一种方法是将队列管理器的实例添加到每个线程,并将变量更改为静态易失性数组。有没有更好的方法来做到这一点?
-
听起来你想要的是一个使用 offer 方法的 BlockingQueue?
-
附带说明,不幸的是,java 中没有无锁队列实现
-
有什么方法可以锁定特定位置吗?如果是这样,我是否必须为每个职位创建一个锁?
-
您需要在一个原子操作中更新该位置的位置和内容,以使其线程安全。这显然需要某种锁定——我认为没有任何方法可以在不使用本机实现的情况下提高 BlockingQueue 实现的性能。
标签: java multithreading locks