Hallo zusammen,
beim Arbeiten mit thraeds bin ich auf ein paar Fragen gestoßen:
1. nehmen wir an ich habe einen integer der mit dem wert 5 initialisiert wird.
Dann nehme ich einen neuen thread, der den wert der variable auf 100 setzt.
Ungefähr gleichzeitig liest ein anderer thread den wert der variablen.
Ist dann garantiert, dass entweder 5 oder 100 rauskommt, oder kann auch ein ganz anderer wert herauskommen, falls mitten beim bit setzen unterbrochen wurde (falls das denn geht)?
2. Hat es irgendeinen Sinn zu synchronisieren durch locks oder volatile oder so, bei einem boolean?
Ich habe mir dazu folgendes überlegt:
erstmal ohne locks o.ä.:
thread 1 setzt einen boolean um, thread 2 liest ungefähr gleichzeitig, dann kommt entweder true oder false heraus, kann bedes passieren
Dann das selbe mit lock:
Thread 1 holt einen lock und setzt den boolean um und öffnet den lock danach, ungefähr gleichzeitig versucht thread 2 den lock zu setzen und auszulesen und den lock dann zu öffnen.
Also wurde die Problematik von wer zuerst liest/schreibt nur auf wer zuerst den lock holt verschoben, wie ich das sehe bringt in diesem fall ein lock nichts.
Wie seht ihr das?
3. Wird bei Verwendung von volatile "optimiert"?
Ich meine zum Beispiel folgendes:
Wir dort der lock zwischem jeden schleifendurchlauf verlassen und neu geholt, oder wird das so gemacht, dass der lock für alle durchläufe geschlossen bleibt?
So, das wars erstmal.
Vielen Dank schonmal für eure Antworten.
beim Arbeiten mit thraeds bin ich auf ein paar Fragen gestoßen:
1. nehmen wir an ich habe einen integer der mit dem wert 5 initialisiert wird.
Dann nehme ich einen neuen thread, der den wert der variable auf 100 setzt.
Ungefähr gleichzeitig liest ein anderer thread den wert der variablen.
Ist dann garantiert, dass entweder 5 oder 100 rauskommt, oder kann auch ein ganz anderer wert herauskommen, falls mitten beim bit setzen unterbrochen wurde (falls das denn geht)?
2. Hat es irgendeinen Sinn zu synchronisieren durch locks oder volatile oder so, bei einem boolean?
Ich habe mir dazu folgendes überlegt:
erstmal ohne locks o.ä.:
thread 1 setzt einen boolean um, thread 2 liest ungefähr gleichzeitig, dann kommt entweder true oder false heraus, kann bedes passieren
Dann das selbe mit lock:
Thread 1 holt einen lock und setzt den boolean um und öffnet den lock danach, ungefähr gleichzeitig versucht thread 2 den lock zu setzen und auszulesen und den lock dann zu öffnen.
Also wurde die Problematik von wer zuerst liest/schreibt nur auf wer zuerst den lock holt verschoben, wie ich das sehe bringt in diesem fall ein lock nichts.
Wie seht ihr das?
3. Wird bei Verwendung von volatile "optimiert"?
Ich meine zum Beispiel folgendes:
Java:
public volatile ArrayList<Integer> al;
//hat irgendnen Inhalt jetzt
for(int i : al)
{
//tu irgendwas
}
So, das wars erstmal.
Vielen Dank schonmal für eure Antworten.