Synchronization on non final field

Generic1

Top Contributor
Hallo,

ich habe ein Problem mit dem synchronisieren und zwar habe ich unteren Sachverhalt,
NetBeans gibt mir eine Warnung aus an der makierten Zeile unten.
Die Liste kann ich nicht final deklarieren, da ich mit der Liste was machen muss im Thread (inneren Klasse).
Weiß jemand was ich machen kann, damit ich diese Warnung nicht mehr bekomme?
Besten Dank,
lg

Java:
package synchronizedtest;

import java.util.ArrayList;
import java.util.List;

public class Main {

    private List<String> list;

    public Main() {
        list = new ArrayList<String>();
        }

    public void setList(final List<String> list) { // liste kann gesetzt werden, daher kann man die Liste nicht final machen
        this.list = list;
        }

    private final class ToDoWithList extends Thread {

        @Override
        public void run() {
            synchronized(list) {  // hier bekomme ich die Warnung "Synchronization on non-final field"
                // hier wird die Liste verwendet
                }
            }
        }
}
 
M

maki

Gast
Wieso solltest du list nciht final deklarieren können?
Verhindert doch nur so Dinge wie [c]list = null[/c] nach der Initiaisierung.
 

Generic1

Top Contributor
wenn ich die Liste als final deklariere, dann wirds mit der setter- Methode, die ich unter nochmal rauskopeirt habe, schwierig.

Java:
public void setList(final List<String> list) { // liste kann gesetzt werden, daher kann man die Liste nicht final machen
        this.list = list;
        }
 

mvitz

Top Contributor
Glaube der übliche "Trick" geht in diesem Falle folgendermaßen:

Java:
package synchronizedtest;

import java.util.List;

public class Main {

    private final List<String>[] lists;

    @SuppressWarnings("unchecked")
    public Main() {
        lists = new List[1];
    }

    public void setList(final List<String> list) {
        lists[0] = list;
    }

    private final class ToDoWithList extends Thread {

        @Override
        public void run() {
            synchronized (lists[0]) {

            }
        }
    }

}
 
M

maki

Gast
@mvitz
Vielleciht steh ich auf dem Schlauch, aber das ist doch dasselbe...

@nrg
war doch ok, die Warnung ist dann weg, das Risiko das gleiche ;)
 

mvitz

Top Contributor
Dasselbe im Vergleich wozu?

Wenn du im Vergleich zum TO meinst, dann habe ich die Liste in ein Eindimensionales Array gepackt. Dadurch kann das Array final sein und man kann die Liste trotzdem neu setzen.
 

Generic1

Top Contributor
@mvitz
Vielleciht steh ich auf dem Schlauch, aber das ist doch dasselbe...

Also in seinem Beispiel ist die warnung weg, der Compiler schaut nur auf die List<String> selber nicht aber
auf die Einträge ([]) -> schräg!!
ich werd mal die Warnung gekonnt ignorieren, ich weiß was ich tu und damit müsste es sich haben,
Besten Dank,
 
M

maki

Gast
Dasselbe im Vergleich wozu?

Wenn du im Vergleich zum TO meinst, dann habe ich die Liste in ein Eindimensionales Array gepackt. Dadurch kann das Array final sein und man kann die Liste trotzdem neu setzen.
.. und das erste element in der Liste kann immer noch null sein... so wie beim TS ;)

synchronized(null) wirft eine NPE
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
turmaline Remote Synchronization Allgemeine Java-Themen 7
G Threads und Synchronization Allgemeine Java-Themen 2
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
G final "spammen" + bedeutung Allgemeine Java-Themen 14
J Final Method Allgemeine Java-Themen 9
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
J private static final String variable Allgemeine Java-Themen 8
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
Z Als Final deklarierte Klasse im Array sortieren Allgemeine Java-Themen 2
G Klasse als final -> Laufzeitverbesserung? Allgemeine Java-Themen 4
T Final Methode dennoch überschreiben! Allgemeine Java-Themen 10
W Innere Klasse und final Allgemeine Java-Themen 11
A Als FINAL deklarieren -> sinnvoll? Allgemeine Java-Themen 16
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
S Reflections und final Allgemeine Java-Themen 19
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
meez immutable final? Allgemeine Java-Themen 23
S Wave Soundausgabe Java 1.4.2 contra 1.5 Final Allgemeine Java-Themen 27
G final und Variablen Allgemeine Java-Themen 16
B Java 5.0 Final Allgemeine Java-Themen 3
M 1.5 final? Allgemeine Java-Themen 2
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
A Fehlermeldung "No vertex field found" Allgemeine Java-Themen 18
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
R Frage zur Klasse 'Field' Allgemeine Java-Themen 5
A serial Version UID field of type long Allgemeine Java-Themen 5
G Problem mit java.lang.reflect.Field Allgemeine Java-Themen 15
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
A Static reference to non-static field Allgemeine Java-Themen 10
E Field-Objekt in JTextField parsen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben