mot clé synchronisé et verrous sur les méthodes d'instance

Luca

J'étudie la concurrence en ce moment et j'apprenais à bloquer les threads.

Je sais qu'un thread peut arriver à un état bloqué lorsque la tâche attachée correspondante tente d'accéder à une méthode qui est verrouillée parce qu'un autre thread a acquis le verrou.

Donc, d'après ce que j'ai lu les blocs de tâches et attendez qu'il puisse accéder à cette méthode et ainsi de suite avec ses activités (à savoir, le reste de la méthode run ()).

Alors pourquoi ce code se termine comme si la tâche pourrait appeler syn.getI () et accéder à la variable dans un état "erroné" (même si la méthode syn.manipulate () est verrouillée, donc je suppose que la tâche ne peut pas appeler getI ())? où est-ce que je me trompe?

public class SynchronizedClass {
    private int i;
    private boolean flag=true;
    public SynchronizedClass(int i){
        this.i=i;
    }
    public int getI(){
        return i;
    }
    public boolean getFlag(){
        return flag;
    }
    public synchronized void manipulate(){
        i=(i*2)+1;  //odd number
        Thread.yield();
        i= i+1; //even number       
    }
    public void close(){
        flag=false;
    }

}
public class MyThread implements Runnable {
    //auto-managed runnable
    Thread t;
    SynchronizedClass syn;
    public MyThread(SynchronizedClass syn){
        this.syn=syn;
        t=new Thread(this);
        t.start();
    }
    @Override
    public void run() {
        while(syn.getFlag()==true){
            syn.manipulate();
            if (syn.getI()%2!=0){
                syn.close();
                System.out.println("exit");
            }

        }

    }
    public static void main(String[] args) {
        SynchronizedClass syn = new SynchronizedClass(1);
        for(int i=0;i<4;++i)
            new MyThread(syn);
    }
}
Jon Skeet

même si la syn.manipulate()méthode est verrouillée, je suppose que la tâche ne peut pas appelergetI()

C'est l'erreur que vous faites, je crois.

Le fait qu'une méthode soit synchronisée ne signifie pas implicitement que tout le reste est synchronisé. Ce n'est pas comme si un thread possédant le moniteur associé à un objet empêche les autres threads d'accéder à cet objet - il arrête simplement les autres threads d'acquérir le moniteur.

Si vous getI()synchronisez la méthode, alors un thread possédant le moniteur manipulate()signifie que les autres threads appelant getI()le même objet devront attendre pour acquérir le moniteur.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

méthodes de notification d'attente java utilisant un mot clé synchronisé

C ++ - mot clé const dans les méthodes et surcharge

Conséquences de l'utilisation du mot clé Virtual sur toutes les méthodes d'une classe?

mot-clé synchronisé java nécessaire sur la méthode getter / setter primitive?

Comment utiliser les méthodes d'instance sur sequelize

Le mot clé local sur les méthodes implique-t-il un stockage automatique?

Override block au lieu du mot clé override sur toutes les méthodes

En Java, quelles sont les performances d'AtomicInteger compareAndSet () par rapport au mot-clé synchronisé?

Différence entre les méthodes statiques et les méthodes d'instance

Dans proguard, quel est le mot-clé pour conserver les variables et méthodes d'accès aux packages / par défaut?

Problème avec le mot-clé const et la déclaration des méthodes

JavaScript ce mot-clé et méthodes d'objet lorsqu'il est passé comme rappel

Java implémentant deux interfaces et résolvant les conflits de méthodes par défaut: pourquoi utiliser un super mot clé?

Codename One et mot-clé synchronisé Java

Android Studio n'identifie pas le mot clé "on" pour les méthodes d'extension Dart

Lorsque vous utilisez le modèle de conception singleton, faire d'autres méthodes doivent utiliser mot-clé synchronisé pour assurer la sécurité de fil?

Initialiseur d'instance et * ce * mot-clé

Désactiver les méthodes d'expédition ayant un mot spécifique et basées sur une classe d'expédition dans WooCommerce

différences jvm entre les méthodes synchronisées et non synchronisées

méthodes synchronisées statiques et synchronisées non statiques dans les threads

Différence entre les méthodes de classe synchronisées (this) et peu synchronisées

Bonne pratique - Passer des méthodes d'instance et d'appel sur une instance

Effets de mémoire du mot clé synchronisé en Java

Augmenter les méthodes avec le mot-clé `alias`

Mot-clé synchronisé imbriqué

Verrous de lecture / écriture sur les méthodes de classe injectée

Quel est l'effet de l'ajout du mot clé "get" sur les méthodes Angular 2?

quelle est la différence entre les méthodes de classe javascript sans et avec mot-clé de fonction ?

Verrous de lecture et d'écriture Java sur une ressource préservant la mémoire

TOP liste

  1. 1

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  2. 2

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  5. 5

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  6. 6

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  7. 7

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  8. 8

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  9. 9

    Trouver l'intersection et l'union de deux rectangles

  10. 10

    Comment convertir une chaîne en tuple en utilisant `reads`?

  11. 11

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  12. 12

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  13. 13

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  14. 14

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  15. 15

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  16. 16

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    comment le contrôle de tableau javascript devrait-il être

  19. 19

    Importation bizarre de Google Sheets importxml - Impossible d'obtenir le chemin correct vers les éléments

  20. 20

    Injecter des éléments dans une liste existante au printemps

  21. 21

    Placez le modeBar en haut au centre à l'aide de plotly.js

chaudétiquette

Archive