In der Minute habe ich gerade synchronisiert, um die Mehrheit der Methoden, wie es scheint, dass ohne diese Methoden mit Thread nicht sicher sein. Gibt es noch etwas, das ich implementieren muss, um sicherzustellen, dass es threadsicher ist?Wie man eine zirkuläre Warteschlange vollständig threadsicher macht
Gibt es auch einen besseren Weg, dies zu tun. Im Moment wird nur ein Thread in der Lage sein, die zyklische Warteschlange auf einmal zu verwenden, dies scheint ein wenig ineffizient zu sein.
class CircularQueue<T> implements Iterable<T>{
private T queue[];
private int head, tail, size;
@SuppressWarnings("unchecked")
public CircularQueue(){
queue = (T[])new Object[20];
head = 0; tail = 0; size = 0;
}
@SuppressWarnings("unchecked")
public CircularQueue(int n){ //assume n >=0
queue = (T[])new Object[n];
size = 0; head = 0; tail = 0;
}
public synchronized boolean join(T x){
if(size < queue.length){
queue[tail] = x;
tail = (tail+1)%queue.length;
size++;
return true;
}
else return false;
}
public synchronized T top(){
if(size > 0)
return queue[head];
else
return null;
}
public synchronized boolean leave(){
if(size == 0) return false;
else{
head = (head+1)%queue.length;
size--;
return true;
}
}
public synchronized boolean full(){return (size == queue.length);}
public boolean empty(){return (size == 0);}
public Iterator<T> iterator(){
return new QIterator<T>(queue, head, size);
}
private static class QIterator<T> implements Iterator<T>{
private T[] d; private int index;
private int size; private int returned = 0;
QIterator(T[] dd, int head, int s){
d = dd; index = head; size = s;
}
public synchronized boolean hasNext(){ return returned < size;}
public synchronized T next(){
if(returned == size) throw new NoSuchElementException();
T item = (T)d[index];
index = (index+1) % d.length;
returned++;
return item;
}
public void remove(){}
}
}
Jeder Rat oder Hilfe, die Sie geben können, würde geschätzt werden!
Wenn Sie den vollen Nutzen von Multithread wollen, sollten Sie in Betracht ziehen, [lock free] (https://codereview.stackexchange.com/questions/12691/o1-lock-free-container) zu gehen. – OldCurmudgeon