Visualizzazione dei risultati da 1 a 4 su 4

Discussione: variabili static e non

  1. #1

    variabili static e non

    Ciao a tutti,
    ho un dubbio: in una situazione del genere

    codice:
    Class A{
         static x;
    }
    
    Class B{
         int y = A.x;
    }
    Se io nella classe B leggo la variabile y e nel frattempo in un altro thread la variabile x viene modificata, leggo le modifiche fatte ad x oppure no?
    Non so se mi sono spiegata, ma quello che vorrei sapere è mediante

    codice:
    int y = A.x;
    copio il contenuto o il riferimento?

    Spero di essere stata chiara nell'esporre il mio dubbio

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: variabili static e non

    Originariamente inviato da VioletFairy
    Se io nella classe B leggo la variabile y e nel frattempo in un altro thread la variabile x viene modificata, leggo le modifiche fatte ad x oppure no?
    Non so se mi sono spiegata, ma quello che vorrei sapere è mediante

    codice:
    int y = A.x;
    copio il contenuto o il riferimento?
    Sempre il valore!! E se fosse un tipo "reference", il valore È il riferimento (all'oggetto).

    Detto in altre parole, una volta che è stato eseguito y=A.x, la x può variare quanto/come vuole ma su y non ha alcun effetto ..... fino ad un'altra assegnazione a y.

    E se andiamo a vedere a livello di "visibilità" tra thread se la domanda cambia in: se un thread T1 fa y=A.x, poi un thread T2 cambia A.x, se successivamente il thread T1 rifa y=A.x "vede" la modifica a x??.

    Non è detto! La questione sulla visibilità delle modifiche tra thread differenti va presa seriamente. Bisognerebbe marcare x come "volatile" e si avrebbe la visibilità garantita. Altrimenti andrebbe usata la sincronizzazione su un lock comune.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Puoi evitare (per certi versi) questa cosa che i tipi primitivi non sono reference, quindi il loro valore non è il reference (come dice giustamente andbin), usando una classe per tenere l'int.

    Dovresti rinunciare a static e sarebbe un po' scomodo nelle operazioni di assegnazione, ma puoi referenziarlo ed in + puoi anche gestire il fatto dell'accesso dai thread dichiarando il metodo set come synchronized (non so se sia questo il caso comunque, perchè hai dato poche info riguardo il tuo progetto).

    La classe sarebbe simile a questa:

    codice:
    public class MioInteger {
        public Integer var;
    
        public void setVal (int v) {
            var = v;
        }
    
        public Integer getVal () {
            return var;
        }
    }
    un oggetto MioInteger sarebbe referenziabile, e puoi usarlo in questo modo:

    codice:
    public class Classe {
        public MioInteger var;
        public Classe () {
            var = new MioInteger();
        }
    }
    ....
            Classe c = new Classe ();
            MioInteger ref = c.var;
    
            c.var.setVal(12);
            System.out.println("var: " + c.var.getVal());
            
            ref.setVal(123);
            System.out.println("var: " + c.var.getVal());
    ....
    l'output sarebbe:

    codice:
    var: 12
    var: 123
    lolide
    Java Programmer

    Informati

  4. #4

    Re: Re: variabili static e non

    Originariamente inviato da andbin

    E se andiamo a vedere a livello di "visibilità" tra thread se la domanda cambia in: se un thread T1 fa y=A.x, poi un thread T2 cambia A.x, se successivamente il thread T1 rifa y=A.x "vede" la modifica a x??.

    Non è detto! La questione sulla visibilità delle modifiche tra thread differenti va presa seriamente. Bisognerebbe marcare x come "volatile" e si avrebbe la visibilità garantita. Altrimenti andrebbe usata la sincronizzazione su un lock comune.
    Buono a sapersi della keyword "volatile"... mi mancava!
    Cmq grazie, hai chiarito tutti i miei dubbi al riguardo. (Come sempre )

    Cmq grazie a tutti delle risposte!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.