Domanda

Sono abbastanza nuovo a thread-safe di programmazione, e si chiedeva se ho qualcosa di simile al di sotto, questo sarebbe al sicuro da situazione di stallo, una volta compilato ed eseguito?

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();
È stato utile?

Soluzione

Il tuo codice visualizzare solo un singolo thread.

Con un solo thread, non c'è modo è possibile ottenere qualsiasi situazione di stallo.

Aggiunto:
linguaggio Java supporta quello che chiamano ufficialmente rientrante sincronizzazione . Fondamentalmente significa che un singolo filo può riacquistare una serratura già possiede.

Altri suggerimenti

La tua domanda è ciò che accade quando si sincronizzano due volte sullo stesso oggetto.

La risposta è: Java controllerà prima quale thread possiede il monitor (che è la struttura interna di dati su cui opera synchronized). Dal momento che il filo proprietario è lo stesso che il thread corrente, Java continuerà.

deadlock può avvenire solo se si dispone di due monitor e si tenta di bloccarli in diversi ordini in diversi thread.

Il blocco preso dalla parola chiave Java sincronizzato supporta la nidificazione, in modo da non rischiare un deadlock sincronizzando sullo stesso oggetto più volte nello stesso thread.

RichN è corretta in quanto il codice contiene un solo filo e quindi deadlock è impossibile. Si noti inoltre che un deadlock si verifichi è necessario avere più thread acquisire più blocchi (anche se in ordine diverso) per un deadlock si verifichi.

Il codice attualmente fa riferimento a un solo blocco: quello associato _mySynchedData. Il fatto che si tenta di bloccarlo due volte non importa come si blocca in Java sono rientrante .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top