Synchronisation en Java?
-
11-09-2019 - |
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();
La solution
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 .