Variablen Volatile

Now

Mitglied
Hallo,

leider weiss ich nicht ob ich hier richtig bin oder das in den Anfängerbereich gehört :).

Ich habe folgendes Problem:

Im moment versuche ich den Wechselseitigenausschluss nach Dekker nach zu bauen nur leider weis ich nciht wie die deklaration der Volatile Variablen aussehn muss. Im Moment habe ich es so implementiert.

Java:
public class ImplementierungJava 
{
  volatile  int turn = 1;
  volatile  int c1 = 1;
  volatile  int c2 = 1;

und das ist die Implementierung in meiner Threadklasse:

Java:
public class Worker extends ImplementierungJava implements Runnable
{

ist das korrekt? denn ohne das extends kommt immer die Fehlermeldung das Worker die Variablen turn , c1 und c2 nicht kennt.

sollte meine Implementierung korrekt sein hab ich nen fehler in meiner logik den ich bisher nicht gefunden habe :).

schonmal vielen Dank an alle die das lesen :).
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
Variablen fremder Klassen sind offensichtlich auf direkte eigene Weise nur sichtbar wenn auch geerbt wird, nur dann sind es 'eigene' Variablen,
mit volatile hat das bisher nichts zu tun

Alternative wäre ein Objekt der anderen Klasse und dann Variablen des Objektes verwenden
 

Now

Mitglied
Hi,

danke für die schnelle Antwort.

mein Problem ist, dass ich nicht weiss wie man mit volatile richtig umgeht, also wie die Implementation aussehen muss, wenn ich eine Klasse habe die aus einer 2. Klasse Threads erstellt.

Java:
public class ImplementierungJava 
{
  volatile  int turn = 1;
  volatile  int c1 = 1;
  volatile  int c2 = 1;

  public static void main (String[] args)
  {
    
    
    for (int i = 1; i <=2; i++)
    {
      Thread worker = new Thread (new Worker (i));
      worker.start ();
  
    }
  }
}

das ist meine erste Klasse, die aus der Klasse Worker Threads erstellt. Um meine Frage genauer zu beschreiben:

was muss ich nun in meine Worker klasse einfügen damit er die Volatile Variablen verwenden kann ohne sie zu erben?
 
S

SlaterB

Gast
das hat doch nichts mit volatie zu tun! bei normalen Variablen ist das Problem EXAKT dasselbe?!

du musst ImplementierungJava an Worker als Konstruktor-Parameter übergeben,
erst dann können logischerweise die Worker mit dem ImplementierungJava-Objekt und dessen Variablen was tun
 

Now

Mitglied
ok^^

das Wörtchen Volatile macht mich fertig :) kla ( meine Tischkante hat jetzt ein Loch) muss ich ihm die Variablen mitgeben aber wie stelle ich nun die Verbindung zwischen den Threads her? so das sie alle mit den selben turn , c1 und c2 arbeiten?
 
S

SlaterB

Gast
wie ich es gesagt habe, weil es solange her ist noch einmal:
du musst ImplementierungJava an Worker als Konstruktor-Parameter übergeben,
erst dann können logischerweise die Worker mit dem ImplementierungJava-Objekt und dessen Variablen was tun

die int-Werte einzeln zu übergeben ginge in der Tat nicht
 

Now

Mitglied
gut ich hätte das ganze doch besser im Anfängerbereich posten sollen^^.

stell ich meine frage mal anderst. kann mir jemand ein ganz kleines unkompliziertes Codebeispiel mit der verwendung von Volatile geben. :)

Und dein Satz hilft mir im mom leider garnicht :( .
 

_Andi91

Bekanntes Mitglied
- mach die Variablen private volatile
- erstelle public setter/getter für die Variablen
- gib dem Worker eine Referenz des ImplementierungJava Objekt im Konstruktor mit

fertig

P.S.: Was volatile bringt ist dir klar oder?
 
M

maki

Gast
Genauer gesagt wird beim lesen einer volitale Variable eben dieser Refresh ausgelöst, wodurch der gesamte (!) Threadcache neu aus dem Hauptspeicher gelesen wird, schreiben führt zu einem Flush des Threadcaches in den Hauptspeicher.

"Herr Moderator" ist übrigens so angebracht wie "Herr Hausmeister" oder "Herr Müllmann" ;)
 

TKausL

Top Contributor
Genauer gesagt wird beim lesen einer volitale Variable eben dieser Refresh ausgelöst, wodurch der gesamte (!) Threadcache neu aus dem Hauptspeicher gelesen wird, schreiben führt zu einem Flush des Threadcaches in den Hauptspeicher.

"Herr Moderator" ist übrigens so angebracht wie "Herr Hausmeister" oder "Herr Müllmann" ;)

Der Gesamte Cache, nicht nur diese eine Variable? Wieder was gelernt.

Ich hab früher auch immer "Herr Busfahrer" gesagt :lol:
 
M

maki

Gast
Ja, der gesamte Cache, führt zu u.U. "interessantem" verhalten.

AngelikaLanger.com - Details zu volatile-Variablen - Angelika Langer Training/Consulting unter "Speichereffekte von volatile auf andere Variablen":
Java:
class FutureResult {   // korrekt, aber nicht unbedingt empfehlenswert
  private volatile boolean ready = false;
  private Object data = null;

  public Object getResult() {
    if (ready);
    return data;
  }
  public boolean isReady() {
    return ready;
  }
  // only one thread may ever call putResult()
  public void putResult(Object o) {
    data = o;
    ready = true;
  }
}
[c]if (ready);[/c] und [c]ready = true;[/c] sehen erstmal irrelevant aus, sind sie aber ganz und gar nicht ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M volatile Java Basics - Anfänger-Themen 3
hdi Keyword volatile Java Basics - Anfänger-Themen 23

Ähnliche Java Themen

Neue Themen


Oben