Hey,
also ich hab schon vor ein paar Wochen etwas bzgl. volatile gefragt. Aber so komplett hab ich diese ganze Geschichte - auch in Verbindung mit synchronized - noch nicht begriffen. Ich sag euch mal was ich darüber denke und ihr sagt mir ob es richtig ist
Also synchronized kann man bei Primitiven nicht benutzen. D.h. man sollte sich dafür ein Objekt nehmen auf das man synchronisiert - entweder die Primitive reinkapseln oder halt "extern" schauen dass alle Threads auf so ein Pseudo-Objekt synchen beim Zugriff auf das Primtive.
Bsp:
Test.count kann jetzt bei mehreren SomeThreads niemals 1001 werden wg. synch auf dem lock, right?
Aber was ist wenn Thread 1 Test.running auf false setzt - das bekommt Thread 2 glaub ich nich zwangsläufig mit oder? Dafür müsste man dann Test.running volatile machen, stimmt das?
Generell ist mir noch nicht ganz klar wie volatile und synchronized zusammenspielen. Wenn ich zB die if-Abfrage oben auch in den synch-Block des "lock" schiebe, führt das dazu dass diese Variablen (zB Test.running) von jedem Thread bei jedem Durchlauf neu geladen werden? Eigentlich haben sie ja mit dem "lock" nichts zu tun oder.
Also wann muss ich bei Primitiven volatile nehmen? IMMER wenn mehrere Threads darauf zugreifen? Und was bringt ein volatile bei Objekten? Wird durch Punkt-Notation nicht immer neu derefernziert, auch ohne volatile?
Okay also nochmal kurz und knapp, im Moment verstehe ich das ganze so. Im Bezug auf Multi-Thread wenn mehrere Threads eine Resource nutzen...
- ...und sie ein Objekt ist dann darauf synchen. Alle Werte die ausgelesen werden sind die aktuellsten weil durch Punkt-Notation die aktuellen Wert jedesmal neu ausgelesen werden
- ...und sie ein Primitive ist, dann kann ich nicht direkt synchen sondern mach mir ein Pseudo-Objekt dass ich als Lock nutze
- ...allerdings garantiert das nicht dass ein Thread beim Zugriff auf das Primtive tatsächlich den aktuellen Wert nimmt, dazu müsste ich es volatile machen
???:L
Danke!
also ich hab schon vor ein paar Wochen etwas bzgl. volatile gefragt. Aber so komplett hab ich diese ganze Geschichte - auch in Verbindung mit synchronized - noch nicht begriffen. Ich sag euch mal was ich darüber denke und ihr sagt mir ob es richtig ist
Also synchronized kann man bei Primitiven nicht benutzen. D.h. man sollte sich dafür ein Objekt nehmen auf das man synchronisiert - entweder die Primitive reinkapseln oder halt "extern" schauen dass alle Threads auf so ein Pseudo-Objekt synchen beim Zugriff auf das Primtive.
Bsp:
Java:
class Test{
public static int count = 0;
public static boolean running = true;
public static Object lock = new Object();
}
class SomeThread extends Thread{
public void run(){
while(Test.running){
synchronized(Test.lock){
if(Test.count < 1000){
Test.count++;
}
}
if(getSomeRandomNumber() == 234){
Test.running = false;
}
}
}
Test.count kann jetzt bei mehreren SomeThreads niemals 1001 werden wg. synch auf dem lock, right?
Aber was ist wenn Thread 1 Test.running auf false setzt - das bekommt Thread 2 glaub ich nich zwangsläufig mit oder? Dafür müsste man dann Test.running volatile machen, stimmt das?
Generell ist mir noch nicht ganz klar wie volatile und synchronized zusammenspielen. Wenn ich zB die if-Abfrage oben auch in den synch-Block des "lock" schiebe, führt das dazu dass diese Variablen (zB Test.running) von jedem Thread bei jedem Durchlauf neu geladen werden? Eigentlich haben sie ja mit dem "lock" nichts zu tun oder.
Also wann muss ich bei Primitiven volatile nehmen? IMMER wenn mehrere Threads darauf zugreifen? Und was bringt ein volatile bei Objekten? Wird durch Punkt-Notation nicht immer neu derefernziert, auch ohne volatile?
Okay also nochmal kurz und knapp, im Moment verstehe ich das ganze so. Im Bezug auf Multi-Thread wenn mehrere Threads eine Resource nutzen...
- ...und sie ein Objekt ist dann darauf synchen. Alle Werte die ausgelesen werden sind die aktuellsten weil durch Punkt-Notation die aktuellen Wert jedesmal neu ausgelesen werden
- ...und sie ein Primitive ist, dann kann ich nicht direkt synchen sondern mach mir ein Pseudo-Objekt dass ich als Lock nutze
- ...allerdings garantiert das nicht dass ein Thread beim Zugriff auf das Primtive tatsächlich den aktuellen Wert nimmt, dazu müsste ich es volatile machen
???:L
Danke!