java - 一个类的对象锁只有一个,类锁呢?
高洛峰
高洛峰 2017-04-18 10:49:00
0
6
688

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(6)
巴扎黑

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é.

洪涛
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.

大家讲道理
  • 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

;

左手右手慢动作

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

伊谢尔伦

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.

伊谢尔伦

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 ;

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!