Metodo non sincronizzato che chiama solo metodi sincronizzati [chiuso]

0

È sicuro creare un metodo non sincronizzato se chiama solo metodi sincronizzati?

Diciamo che abbiamo:

public class SomeClass{
    public synchronized void A(){
        //Some code
    }
    public synchronized void B(){
        //Some code
    }
    public synchronized void C(){
        A();
        B();
    }
}

La C () dovrebbe essere sincronizzata o no?

    
posta André Santos 23.09.2015 - 20:24
fonte

1 risposta

5

Questo dipende. Potrebbero esserci problemi se qualcosa accade tra le chiamate a A e B ? Se è così, allora C dovrebbe essere sincronizzato.

public class SomeClass{
    private int i;
    public synchronized void A(){
        i += 1;
    }
    public synchronized void B(){
        print i; // uses something modified by A
    }
    public void C(){ // unsynchronized so...
        A();
        // ...i could be changed here by another thread, affecting what B prints
        B();
    }
}

Se non ci sono sezioni critiche tra A e B , allora C non ha bisogno di essere sincronizzato.

public class SomeClass{
    private int i;
    public synchronized void A(){
        i += 1;
    }
    public synchronized void B(){
        print "B"; // unrelated to what A does
    }
    public void C(){
        A();
        // i could be changed here, but won't affect B
        B();
    }
}
    
risposta data 23.09.2015 - 20:27
fonte

Leggi altre domande sui tag