Hallo zusammen,
hab wieder eine Aufgabe zur Parallelität, dort soll man eine Queue schreiben die mit Threads ein Determiniertes Ergebnis liefert. Sprich es soll natürlich bei gleichen Startwerten immer das gleiche Ergebnis geliefert werden.
Wenn man die Queue nicht synchronisiert bekommt man irgendwann da Lesend und Schreiben drauf zugegriffen wird ein falsches Ergebnis.
So nun genug davon, nun dachte ich erst einmal an eine "simple" Lösung wie diese hier:
Natürlich könnte man das ganze auch mit eine Inneren Klasse Node lösen etc. doch da habe ich eigentlich das selbe Problem bzw. die gleiche Frage wie ich bei dieser angegeben Lösung habe.
Nun sind ja nur die zwei Methoden enqueue und dequeue geschützt, da sämtliche Java Anweisungen nicht atomar sind somit unterbrechbar könnte doch data.add() oder data.removeFirst() unterbrochen werden. Hab ich hierbei ein Denkfehler oder stimmt das? Falls das stimmt wäre meine Idee nichts wert!
Nun habe ich etwas gesucht im Internet und das hier gefunden:
Beim zweiten hin sehen entsteht hierbei doch das selbe Problem.
Gibt es eine Möglichkeit eine ganze Klasse Synchronized zu erschaffen? So könnte man seine ganz eigene queue erstellen mit einer Node als InnerClass diese dann Synchronized machen und da die 2 Methoden synch. sind und die Klasse Node dann auch wäre das ganze Konstrukt nicht mehr unterbrechbar oder erneut ein Denkfehler?
Ich hoffe man verstehe was ich möchte. Bin gespannt wo mein Fehler ist ;-)
hab wieder eine Aufgabe zur Parallelität, dort soll man eine Queue schreiben die mit Threads ein Determiniertes Ergebnis liefert. Sprich es soll natürlich bei gleichen Startwerten immer das gleiche Ergebnis geliefert werden.
Wenn man die Queue nicht synchronisiert bekommt man irgendwann da Lesend und Schreiben drauf zugegriffen wird ein falsches Ergebnis.
So nun genug davon, nun dachte ich erst einmal an eine "simple" Lösung wie diese hier:
Java:
import java.util.LinkedList;
public class Queue<T> {
private LinkedList<T> data;
public Queue() {
data = new LinkedList<T>();
}
synchronized public void enqueue(T object) {
data.add(object);
}
synchronized public T dequeue() {
if(data.isEmpty())
return null;
return data.removeFirst();
}
}
Natürlich könnte man das ganze auch mit eine Inneren Klasse Node lösen etc. doch da habe ich eigentlich das selbe Problem bzw. die gleiche Frage wie ich bei dieser angegeben Lösung habe.
Nun sind ja nur die zwei Methoden enqueue und dequeue geschützt, da sämtliche Java Anweisungen nicht atomar sind somit unterbrechbar könnte doch data.add() oder data.removeFirst() unterbrochen werden. Hab ich hierbei ein Denkfehler oder stimmt das? Falls das stimmt wäre meine Idee nichts wert!
Nun habe ich etwas gesucht im Internet und das hier gefunden:
Java:
public class SynchronizedLinkedList<T> implements List<T> {
private LinkedList<T> list;
private Object lock;
public void add(T object) {
synchronized(lock) {
list.add(object);
}
}
// etc.
}
Beim zweiten hin sehen entsteht hierbei doch das selbe Problem.
Gibt es eine Möglichkeit eine ganze Klasse Synchronized zu erschaffen? So könnte man seine ganz eigene queue erstellen mit einer Node als InnerClass diese dann Synchronized machen und da die 2 Methoden synch. sind und die Klasse Node dann auch wäre das ganze Konstrukt nicht mehr unterbrechbar oder erneut ein Denkfehler?
Ich hoffe man verstehe was ich möchte. Bin gespannt wo mein Fehler ist ;-)