Maison  >  Questions et réponses  >  le corps du texte

java - 一个类的对象锁只有一个,类锁呢?

一个类的对象锁只有一个,如果有几个非静态函数都是synchronized,在某一时刻只有一个线程能调用其中一个函数

假如一个类有几个静态函数是synchronized,在某一时刻只有一个线程能调用其中一个静态函数吗?也就是类锁也只有一个吗?

高洛峰高洛峰2744 Il y a quelques jours692

répondre à tous(6)je répondrai

  • 巴扎黑

    巴扎黑2017-04-18 10:51:00

    La première verrouille l'objet instance, verrouillant l'objet actuel. S'il y a plusieurs objets instance, ces synchronized méthodes ne sont pas synchronisées. Le deuxième type de verrou est un objet de classe. Il n’existe qu’un seul objet de classe, il est donc synchronisé.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:51:00

    public class Foo {
    
        synchronized void test1() {
            //to implements
        }
    
        void test2() {
            synchronized(this) {
                //to implements
            }
        }
    
        synchronized static void test3() {
            //to implements
        }
    
        static void test4() {
            synchronized(Foo.class) {
                //to implements
            }
        }
    }

    Comme le montre le code ci-dessus, la méthode test1 est équivalente à test2 Lorsqu'il s'agit du même objet, un blocage se produira. Bien sûr, peu importe qu’il s’agisse d’objets différents, car celui-ci est différent. Appelé verrouillage au niveau de l'objet.
    Test3 est équivalent à test4. Ici, l'objet classe est utilisé comme verrou, car généralement il n'y a qu'une seule instance de classe, donc chaque fois que vous entrez cette méthode, elle sera verrouillée. C'est ce qu'on appelle un verrou au niveau de la classe.

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:51:00

    • Le verrou utilisé par la méthode de synchronisation non statique (A) est l'objet d'instance actuel lui-même. Une fois que A d'une instance a acquis le verrou, les autres A de l'instance doivent attendre que le verrou soit libéré multiple. les instances en utilisent des différents. Lock

    • Le verrou utilisé par la méthode de synchronisation statique (B) est l'objet de classe lui-même. Une fois qu'un B acquiert le verrou, l'autre B doit attendre pour libérer le verrou, qu'il s'agisse d'une ou de plusieurs instances <🎜 ; >

    De plus, des verrous différents sont utilisés entre A et B, il n'y aura donc pas de concurrence

    ;

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:51:00

    ClassUne classe crée un objet pour représenter une classe ordinaire. À ce stade, le "verrou de classe" est le verrou sur cet objet instance

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:00

    Vous parlez de la notion de « verrouillage mutex ». Il existe deux situations pour la méthode de modification synchronisée :

    【Méthode non statique】

    Lorsqu'une méthode est modifiée par synchronisé, l'objet verrou est l'objet auquel appartient la méthode actuelle, qui est ceci dans la méthode.

    【Méthode statique】

    Lorsqu'une méthode statique est modifiée par synchronisé, l'objet verrouillé par la méthode statique est l'objet de classe actuel (une instance de la classe Class). Chaque classe possède un objet de classe unique. Comment obtenir un objet de classe : classname.class.

    Pour des scénarios mutuellement exclusifs, deux points doivent être compris :

    1. Les méthodes statiques et les méthodes non statiques sont déclarées synchronisées en même temps, et il existe une relation non mutuellement exclusive entre elles. La raison en est que les méthodes statiques verrouillent l'objet de classe plutôt que l'objet auquel appartient la méthode actuelle.

    2. Lorsque Synchronized modifie deux morceaux de code différents, mais que les objets de verrouillage sont les mêmes, les deux threads s'excluent mutuellement lorsqu'ils appellent respectivement les deux morceaux de code

    Ainsi, lorsque vous dites "un seul thread peut appeler l'une des fonctions à la fois" (c'est-à-dire une exclusion mutuelle), la condition de jugement est de savoir si les objets de verrouillage sont les mêmes, quel que soit le type de méthode.

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:00

    Pour la modification synchronisée des méthodes d'objet, le verrou est l'objet lui-même, c'est-à-dire ceci ;
    Pour la modification synchronisée des méthodes statiques, le verrou est l'objet Class lui-même, qui est l'objet de classe créé par le chargeur de classe ;

    répondre
    0
  • Annulerrépondre