sporadisches Deadlock und noch ein Schmankerl ;)

Status
Nicht offen für weitere Antworten.
U

ugh_bough_

Gast
Hallihallo.
Ich habe ein kleines Problem, bei dem ich nicht weiß, woher es resultiert.

1. Deadlock:
Pseudocode:
Code:
class MyPanel
extends JPanel
{
    //
    private synchronized void doIt(arg)
    {
        ... // zugriff auf die methoden eines objekts, welches collections verwaltet
            // keine änderung in irgendwelchen swingObjekten
    }

    private Thread
    {
        public void run()
        {
            ...
            doIt(...);    // vom programm aufgerufen
            ...
        }
    }

    void aButtonWasClicked(ActionEvent e)
    {
        doIt(...);    // vom benutzer aufgerufen
    }
}

Grundgedanke:
Der Thread wertet Daten aus, die dann in das in doIt() erwähnte Objekt übergeben werden, welches sie in verschiedenen collections sammelt. doIt() wird also aus dem anonymen Thread und vom Benutzer aus dem Swing-Thread aus aufgerufen, der auch Daten auflisten will.

Problem:
Ab und zu kommt es zu einem Deadlock, den ich mir nicht erklären kann. In den meisten Fällen funktioniert es. Könnte mir auch nicht erklären, daß es irgendwie an Swing läge.

Lösung:
Kann ich einfach darauf verzichten, doIt() synchronized zu machen und statt dessen die Collections in dem benutzen Objekt (nicht im JPanel) synchronized machen? Ich habe diese Lösung sein lassen, da
1. die Daten im die collections beherbergenden Objekt noch in Schleifen verarbeitet werden und
2. ich mir nicht sicher war, ob diese Synchronität sich bis auf die oben gezeigt Ebene (also die Trennung vom Automatik-Thread und dem Benutzer-Thred) durchschlägt.

Danke für Hilfe.

PS: Java 5, falls es doch wichtig ist.





Nun zum Schmankerl:
Ist eigentlich nur eine Interessefrage.
Code:
HashSet<Object> set = new HashSet<Object>(); // irgendein Inhalt. Für die Frage irrelevant
... // set füllen
// nun einen Iterator holen und für jedes Objekt o im Iterator
    set.remove(o); // knackpunkt
Kann man die einträge der Collection (HashSet hab ich nur als Bsp benutzt) löschen, wärend man mit nem Iterator drüberläuft? Sollte doch eigentlich gehen, oder? Der It macht doch Kopien der Referenzen der in der Collection enthaltenen Objekte, oder nicht?
 

Wildcard

Top Contributor
ugh_bough_ hat gesagt.:
Kann ich einfach darauf verzichten, doIt() synchronized zu machen und statt dessen die Collections in dem benutzen Objekt (nicht im JPanel) synchronized machen?
Gibt doch schon synchronisierte Collections
ugh_bough_ hat gesagt.:
Kann man die einträge der Collection (HashSet hab ich nur als Bsp benutzt) löschen, wärend man mit nem Iterator drüberläuft? Sollte doch eigentlich gehen, oder? Der It macht doch Kopien der Referenzen der in der Collection enthaltenen Objekte, oder nicht?
Nur über den Iterator löschen!!!
 
U

ugh_bough_

Gast
1. Das meinte ich. Habe nur gedacht, daß es zu Problemen führen könnte, denn doIt() könnte ja mitunter gleichzeitig mehrmals laufen und ebenso die Methoden des Objekts, dass die Daten weiter auswertet und dann in die Collections legt.
Du meinst also, dass es ok ist und keinerlei Probleme mit sich bringt.
(Mist, muß mich mal mehr mit Thread beschäftigen. Erst recht mit java.util.concurrent ;)

2. War das ein Befehlt? Die Methode scheint also ok zu sein.
 

Wildcard

Top Contributor
ugh_bough_ hat gesagt.:
Das meinte ich. Habe nur gedacht, daß es zu Problemen führen könnte, denn doIt() könnte ja mitunter gleichzeitig mehrmals laufen und ebenso die Methoden des Objekts, dass die Daten weiter auswertet und dann in die Collections legt.
deshalb ja synchronized

ugh_bough_ hat gesagt.:
Die Methode scheint also ok zu sein.
Als Beispiel:

Code:
            List a = new Vector();
            Iterator it = a.iterator();
            while(it.hasNext())
            {
                it.next();
                it.remove();
                //NIE a.remove()
            }
klar was ich meine?
 
U

ugh_bough_

Gast
ja ok klar aber wieso über den it löschen. lass mich raten, weil er dann die referenzen aus sich selbst auch rauslöscht?
 
U

ugh_bough_

Gast
frage 1 hatte nichts zu tun mit frage 2

obwohl mir das mit der ersten lösung immer noch irgendwie suspekt ist. ich hab da kein VERTRAUEN ;)
 

Wildcard

Top Contributor
Nein, weil er dann eine Exception wirft, da die Collection weniger Element enthält als der Iterator erwartet.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Deadlock bei ServerSocket AWT, Swing, JavaFX & SWT 3
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
K Wie kann ich noch den scale bekommen, außer mit getScaleX oder getScaleY? AWT, Swing, JavaFX & SWT 1
P Swing GUI noch nicht gezeichnet - Logik läuft - blockiert AWT, Swing, JavaFX & SWT 3
P Swing Nach removeAll() noch 1 Element vorhanden AWT, Swing, JavaFX & SWT 0
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
B Swing Noch ein Zeichenprogramm... AWT, Swing, JavaFX & SWT 19
R Noch einmal x^2 bzw. parabel AWT, Swing, JavaFX & SWT 2
V Swing Neue Größe bei ComponentListener noch nicht verfügbar? AWT, Swing, JavaFX & SWT 3
S 3D-Grafik Java3D und was noch? AWT, Swing, JavaFX & SWT 3
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Nicer LookAndFeel Suche noch LaFs AWT, Swing, JavaFX & SWT 7
2 Werde Java GUIs immer noch mit dem in die Jahre gekommen Swing gemacht? AWT, Swing, JavaFX & SWT 12
M SWT Mutter-Shell blocken während Tochter-Shell noch offen ist AWT, Swing, JavaFX & SWT 6
R noch ein DoubleBuffering Noob AWT, Swing, JavaFX & SWT 10
S Swing noch nicht übergebenen Wert aus JComboBox auslesen AWT, Swing, JavaFX & SWT 4
S Swing Fenster schliessen, javaw noch im Speicher AWT, Swing, JavaFX & SWT 5
U JList mit Hintergrundbild hinterlegen und noch ne Frage AWT, Swing, JavaFX & SWT 4
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
G JTree mouseClicked -> kontrolle ob noch ein unterknoten e AWT, Swing, JavaFX & SWT 2
A Noch mal Zusammenarbeit Java und HTML AWT, Swing, JavaFX & SWT 4
A Noch mals Probleme mit Login AWT, Swing, JavaFX & SWT 3
G Text eines noch aktiv editierten Textfeldes lesen AWT, Swing, JavaFX & SWT 2
H Noch einmal JList (nichts auswählen) AWT, Swing, JavaFX & SWT 2
C AWT, Swing & was sonst noch. AWT, Swing, JavaFX & SWT 11
E Toturial weg! Hat noch wer ne Kopie! AWT, Swing, JavaFX & SWT 3
M Es bleibt immer noch eine Javaw instanz zurück AWT, Swing, JavaFX & SWT 3
H Swing nach schließen noch sichtbar AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben