Question

Je suis assez nouveau pour thread-safe programmation, et je me demandais si j'ai quelque chose comme ci-dessous, serait-ce à l'abri de l'impasse une fois compilé et exécuté?

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();
Était-ce utile?

La solution

Votre code affiche un seul fil.

Avec un seul fil, il n'y a aucun moyen que vous pouvez obtenir une impasse.

Ajouté:
langage Java prend en charge ce qu'ils appellent officiellement rentrante de synchronisation. Cela signifie en fait qu'un seul thread peut réacquérir un verrou qu'il possède déjà.

Autres conseils

Votre question est ce qui se passe lorsque vous synchronisez deux fois sur le même objet.

La réponse est: Java vérifier d'abord thread qui possède le moniteur (qui est la structure de données interne sur laquelle fonctionne synchronized). Étant donné que le thread propriétaire est le même que le thread courant, Java continuera.

ne peut se produire interblocages si vous avez deux moniteurs, et vous essayez de les enfermer dans des ordres différents dans différents threads.

Le verrou prise par le mot-clé synchronisé Java prend en charge l'imbrication, de sorte que vous ne risquez pas de blocage en synchronisant sur le même objet plusieurs fois dans le même fil.

RichN est correct que votre code ne contient qu'un seul thread et donc l'impasse est impossible. Notez également que pour une impasse vous devez avoir produit plusieurs threads acquisition plusieurs verrous (bien que dans un ordre différent ) pour un blocage de se produire.

Votre code fait référence à l'heure actuelle un seul verrou: celui associé à _mySynchedData. Le fait que vous essayez de le verrouiller ne double pas d'importance que les verrous en Java sont rentrante .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top