Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - keyword volatile
Forum - Java - keyword volatile

Avatar
robyp7 (Normal User)
Newbie


Messaggi: 13
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 15:28
Mercoledì, 02/07/2008
Salve

ho problemi nel comprendere l'uso della keyword volatile, sembra che in questo esempio non funzioni!:
se non ho capito male quando ci sono 1 o più thread (single o multi trhead è =) appena una variable dichiarata di tipo volatile viene letta da tutti questi viene fatto in modo che l'ultima modifica al valore della variabile appaia a tutti e che tutti quindi leggano quell'ultimo valore..ho trovato questo esempio che di volatile ha solo una variabile booleana missedIt mentre la variabile intera value (sempre nel metodo run) non è stata dischiarata apposta volatile. Tale variabile modificata dal trhead principale "main" nel metodo workflow il cui valore da 10 passa a 60, viene cmq letta dal while del metodo run al valore apena aggiornato (60)facendo terminare il metodo run quando se non ho capito male non essendo volatile il valore vecchio dovrebbe rimanere e solamente la variabile booleana missedIt dovrebbe apparire aggiornata a true e far stampare print("in run() - see value=" + currValue
+ ", but rumor has it that it changed!");
print("in run() - valueAfterSync=" + valueAfterSync);


l'esempio di cui parlo è qua sotto, dato che è poco identato lo trovate + ordinato al
link: http://www.java2s.com/Code/Java/Threads/Illustratethevolat ...

se la print da errore l'ho modificata qua come nel file che ho allegato

grazie!


Non  ho capito perchè non mi ha allegato nulla cmq il codice con la print funzionante (se copiate il codice dal sito la print non funziona) è :

public class Volatile implements Runnable {

    // not marked as 'volatile', but it should be!
      private int value;

      private volatile boolean missedIt;

      // doesn't need to be volatile-doesn't change
      private long creationTime;

      public Volatile() {
        value = 10;
        missedIt = false;
        creationTime = System.currentTimeMillis();
      }

      public void run() {
        print("entering run()");

        // each time, check to see if 'value' is different
        while (value < 20) {
          // Used to break out of the loop if change to
          // value is missed.
          if (missedIt) {
            int currValue = value;

            // Simply execute a synchronized statement on an
            // arbitrary object to see the effect.
            Object lock = new Object();
            synchronized (lock) {
              // do nothing!
                print("i'm in block");
            }

            int valueAfterSync = value;

            print("in run() - see value=" + currValue
                + ", but rumor has it that it changed!");
            print("in run() - valueAfterSync=" + valueAfterSync);

            break;
          }
        }

        print("leaving run() with value = " + value);
      }

      public void workMethod() throws InterruptedException {
        print("entering workMethod()");

        print("about to sleep for 2 seconds");
        Thread.sleep(2000);

        value = 60;
        print("just set value=" + value);

        print("about to sleep for 5 seconds");
        Thread.sleep(5000);

        missedIt = true;
        print("just set missedIt=" + missedIt);

        print("about to sleep for 3 seconds");
        Thread.sleep(3000);

        //value = 50;
        //print("just set value=" + value);
        
        print("leaving workMethod()");
      }
      
      private void s(String msg){
          System.out.println(msg);
      }
      private void s(long msg){
          System.out.println(msg);
      }
      

      private void print(String msg) {
        
        long interval = System.currentTimeMillis() - creationTime;
        
        
        String tmpStr = (interval / 1000.0) + "000";
        

        int pos = tmpStr.indexOf(".");
        
        //s(pos);
        
        String secStr = tmpStr.substring(pos + 2, pos + 4);

        String nameStr = Thread.currentThread().getName();

        nameStr = nameStr.substring(0/*length()*- 8*/, nameStr.length());

        System.out.println(secStr + " " + nameStr + ": " + msg);
      }

      public static void main(String[] args) {
        try {
          Volatile vol = new Volatile();

          // slight pause to let some time elapse
          Thread.sleep(100);

          Thread t = new Thread(vol);
          t.start();

          // slight pause to allow run() to go first
          Thread.sleep(100);

          vol.workMethod();
        } catch (InterruptedException x) {
          System.err.println("one of the sleeps was interrupted");
        }
      }
    
}


Ultima modifica effettuata da robyp7 il 02/07/2008 alle 15:31
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:30
Mercoledì, 02/07/2008
Una buona spiegazione di cosa sono le variabili dichiarate come volatili in java la trovi qui (in inglese): http://www.javaperformancetuning.com/news/qotm030.shtml


Il mio blog: https://piero.dev
PM Quote
Avatar
robyp7 (Normal User)
Newbie


Messaggi: 13
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 19:06
Mercoledì, 02/07/2008

ok, grazie!

se non ho capito male + o - è quello che avevo capito io, il problema è che non funziona ma scometto che sarà un problema che capita quando si hanno un certo numero di thread per cui l'uso di un nuovo thread cancella il valore memorizzato nel registro della cpu e quindi occorrerebbe un reload del valore dalla memoria ram in modo da non leggere un valore sporco.Quando si hanno molte variabili penso sia meglio usare synchronized su un metodo o un blocco che usare una variabile volatile.

Testo quotato

Postato originariamente da pierotofy:

Una buona spiegazione di cosa sono le variabili dichiarate come volatili in java la trovi qui (in inglese): http://www.javaperformancetuning.com/news/qotm030.shtml


PM Quote