2017-08-11 8 views
2

Ich schreibe einige Codes, woJava - gleiches Objekt, verschiedene Variablen, mehrere Threads

class A { 
    Integer x; 
    String y 
} 

ich ein Objekt von A erstellt, und ich bin es vorbei an 2 runnable Fäden. Der erste Thread aktualisiert den Wert x, während der zweite den Wert y aktualisiert.

Gibt es irgendein Szenario, in dem dies brechen kann? Ich meine, kann es eine Race Condition geben, wenn zwei Threads verschiedene Variablen desselben Objekts aktualisieren?

+2

Warum brauchen Sie dann ein einzelnes Objekt? Übergeben Sie verschiedene Objekte an verschiedene Threads –

+1

Ja, es gibt viele Szenarien, in denen dies brechen kann. Sie müssen lesen http://jcip.net/ – Oleg

+1

Welchen Thread _reading_ die Daten? –

Antwort

0

Nein, es wird gut funktionieren. Solange eine gegebene Variable nur von einem Thread aktualisiert wird (mit einigen Bedingungen beim Lesen dieser Variablen durch andere Threads), ist alles in Ordnung.

Es kann nicht das verständlichste Design sein, abhängig davon, was Sie tun - auch, wie ich oben erwähnt habe, nicht darauf zählen, diese Variablen aus einem anderen Thread zuverlässig zu lesen, wenn Sie in atomare Objekte oder flüchtig. (Atomic für schreibt von mehreren Threads schneller sein, flüchtige noch besser sein kann, wenn man nur von einem Thread schreiben und von anderen zu lesen)

+2

Diese Antwort fühlt sich an wie eine Handwelle: Die "einige Bedingungen beim Lesen dieser Variablen durch andere Threads" ist der wichtigste Teil! Es gibt viele nicht offensichtliche Verhaltensweisen, die in dem beschriebenen Szenario auftreten können, abhängig davon, wo 'x' und' y' genau * gelesen * sind, was hier der wichtige Teil ist. –

0

Multithreading ist nicht nur über Rennbedingungen es geht auch um die Sichtbarkeit Speicher formuliert durch
jsr-133 was du unbedingt lernen musst, wenn du Nebenläufigkeit in Java verstehen willst.

Es gibt wahrscheinlich viele Möglichkeiten, in denen Sie Ihren Code brechen kann, ein offensichtliches Beispiel ist, wenn Sie Ihr Objekt in Thread eine Änderung x in Thread B und y in Faden C schaffen Sie nie jene Änderungen Thema A. sehen könnte

machen x und y flüchtigen

class A { 
    volatile Integer x; 
    volatile String y; 
} 

Dadurch wird sichergestellt, dass alle Threads sehen Änderungen an x ​​und y

A a = new A(); 
a.x = 0; 

Thread t1 = new Thread(() -> { 
    while (true) { 
     a.x = 1; 
    } 
}); 

Thread t2 = new Thread(() -> { 
    a.y = "a"; 
}); 

t1.start(); 
t2.start(); 

while(a.x == 0) { 
} 

System.out.println("might never get here"); 

Eine mögliche Lösung ist:

zu Einige Code zu illustrieren Sie müssen jedoch sicherstellen, dass die Instanz von A sicher veröffentlicht wird.

+0

@BillK "Wenn der Autor einfach verschiedene Variablen aus zwei Threads schreibt, geht es ihm gut" ** absolut nicht !!! ** Ohne sicherzustellen, dass Schreibvorgänge korrekt angezeigt werden, wird er mit unerwartetem Verhalten und falschen Werten enden. Ich entwarf ein Szenario, das seiner Fragestellung entspricht und bricht (zumindest kann es brechen, es wird schwierig sein, es tatsächlich zu sehen). – Oleg

Verwandte Themen