Java Multithreading und globale Variablen

7

Ich habe eine Java-Klasse, die zwei separate Threads startet. Der erste Thread startet gut und alle Variablen sind korrekt.

Wenn ich den zweiten Thread starte, ändern sich die globalen Variablen von Thread eins zu den in Thread 2 eingestellten Werten.

Ich habe versucht, synchronisierte Blöcke hinzuzufügen, wo die globalen Variablen aktualisiert werden, aber das hat nicht funktioniert.

Gibt es eine Möglichkeit, dieses Problem zu lösen? Ich möchte, dass jeder Thread startet und seine eigenen Werte verwendet, ohne andere Thread-Werte zu beeinflussen.

BEARBEITEN:

Snippet meiner Thread-Klasse:

%Vor%     
lulu88 29.05.2013, 08:16
quelle

5 Antworten

13

Statische Variablen werden zwischen allen Threads geteilt, das macht sie statisch. Wenn Sie unterschiedliche Werte verwenden möchten, verwenden Sie entweder ThreadLocals oder (viel besser) unterschiedliche Objekte mit nicht statischen Variablen in den verschiedenen Threads. Ohne weiteren Code ist es allerdings schwer mehr zu sagen.

    
koljaTM 29.05.2013, 08:20
quelle
6

Die Synchronisierung steuert lediglich den Zugriff der Threads auf den gemeinsamen Status.

Wenn Sie einen separaten Status pro Thread wünschen, müssen Sie entweder verschiedene Instanzen dieser Informationen (z. B. Klassen) pro Thread deklarieren. z.B. Implementiere einfach ein neues Objekt in jeder Thread Methode run() oder führe eine Kopie der fraglichen Struktur durch (z. B. eine tiefe Kopie einer Sammlung)

Eine Alternative ist es, ThreadLocal , in dem jeder Thread ist, zu untersuchen wird eine andere Kopie einer nominierten Ressource haben.

    
Brian Agnew 29.05.2013 08:18
quelle
2

Wenn Sie nicht möchten, dass Ihre Variable geteilt wird, dann verwenden Sie keine globale Variable (Sie meinen wahrscheinlich static in Java). Erstellen Sie ein neues Feld mit einem neuen Objekt, das beim Start des Threads initialisiert wird. Beispiel:

%Vor%

Wenn Sie wirklich auf Ihre Objekte über verschiedene Codeabschnitte hinweg lokal auf Ihren Thread zugreifen müssen, verwenden Sie ThreadLocal

%Vor%

Bei der Synchronisierung wird verhindert, dass zwei Threads gleichzeitig in den synchronisierten Codeblock gelangen. Es bezieht sich auch auf das Teilen von Variablen zwischen Threads, aber im umgekehrten Fall - wenn Sie sie gemeinsam nutzen möchten. Ohne Synchronisierung sind Ihre Änderungen von einem Thread möglicherweise für andere Threads sichtbar oder nicht (siehe hier und hier )

    
Mifeet 29.05.2013 08:25
quelle
0

Wenn ich das richtig verstehe, sollten Sie sich den Modifikator final ansehen:

%Vor%

Dies stellt sicher, dass s nicht geändert werden kann, sodass Ihre Threads ihren Wert nicht ändern können.

Stellen Sie außerdem sicher, dass Ihre Threads nicht versuchen, Werte zu ändern, die sie nicht sollten, sondern kopieren Sie sie stattdessen.

    
Djon 29.05.2013 08:18
quelle
0

Wenn Sie statische Variablen verwenden möchten, sollten Sie synchronisierte Blöcke für das Klassenobjekt in Ihren synchronisierten Methoden verwenden.

%Vor%

}

Stellen Sie sicher, dass auf alle statischen Variablen von einer synchronisierten Methode / einem synchronisierten Block auf der class object zugegriffen wird und nicht auf einer Instanzvariablen oder einer this -Instanz. Die von Ihnen verwendete synchronisierte Methode gilt für this instance bedeutet das aktuelle Objekt, mit dem Sie die Methode aufrufen, und die statischen Variablen werden von allen Objekten gemeinsam verwendet.

    
Jatin Sehgal 29.05.2013 09:05
quelle