Maison  >  Article  >  Java  >  Nouvelles questions d'entretien Java 2020 - Multi-threading (4)

Nouvelles questions d'entretien Java 2020 - Multi-threading (4)

王林
王林avant
2020-05-29 17:22:582177parcourir

Nouvelles questions d'entretien Java 2020 - Multi-threading (4)

1. Comment éviter les impasses ?

Quatre conditions nécessaires en cas de blocage :

Condition d'exclusion mutuelle : un processus ne permet pas aux autres processus d'accéder aux ressources allouées. Si d'autres processus accèdent aux ressources, ils ne peuvent qu'attendre. le processus occupant la ressource libère la ressource après avoir terminé son utilisation

Conditions de demande et de conservation : Une fois que le processus a obtenu une certaine ressource, il fait une demande pour d'autres ressources, mais la ressource peut être occupée par d'autres processus. La demande est bloquée, mais la ressource obtenue par elle-même est conservée

Condition de non-privation : fait référence à la ressource que le processus a obtenue, qui ne peut être privée avant la fin de l'utilisation, et ne peut être libérée qu'après utilisation

Conditions d'attente de boucle : fait référence à la formation d'une relation de ressource d'attente cyclique tête-à-queue entre plusieurs processus après qu'un blocage se produit dans un processus

Ces quatre conditions sont les conditions nécessaires à l'impasse, tant qu'un blocage se produit dans le système, ces conditions doivent être vraies, et tant que l'une des conditions ci-dessus n'est pas remplie, un blocage ne se produira pas.

En comprenant les causes des blocages, en particulier les quatre conditions nécessaires aux blocages, vous pouvez éviter, prévenir et éliminer les blocages dans la mesure du possible.

Par conséquent, en termes de conception du système, de planification des processus, etc., faites attention à la manière d'empêcher l'établissement de ces quatre conditions nécessaires et à la manière de déterminer un algorithme d'allocation de ressources raisonnable pour éviter que les processus n'occupent en permanence les ressources du système. .

De plus, il est également nécessaire d'empêcher les processus d'occuper des ressources lorsqu'ils sont en état d'attente. L’allocation des ressources doit donc être correctement planifiée.

(Tutoriel vidéo recommandé : vidéo Java)

2. Qu'est-ce que ThreadLocal ? Quels sont les scénarios d’utilisation ?

Les variables locales du thread sont des variables limitées au thread. Elles appartiennent au thread lui-même et ne sont pas partagées entre plusieurs threads. Java fournit la classe ThreadLocal pour prendre en charge les variables locales de thread, ce qui constitue un moyen d'assurer la sécurité des threads. Mais soyez particulièrement prudent lorsque vous utilisez des variables locales de thread dans un environnement géré (tel qu'un serveur Web), où la durée de vie du thread de travail est plus longue que la durée de vie de n'importe quelle variable d'application. Une fois qu'une variable locale du thread n'est pas publiée une fois le travail terminé, l'application Java risque de subir des fuites de mémoire.

3. Parlez-moi du principe de mise en œuvre sous-jacent de la synchronisation ?

Synchronisé peut garantir que lorsqu'une méthode ou un bloc de code est en cours d'exécution, une seule méthode peut accéder à la section critique en même temps, et il peut également garantir la visibilité de la mémoire des variables partagées.

Chaque objet en Java peut être utilisé comme verrou, ce qui constitue la base de l'implémentation synchronisée de la synchronisation :

Méthode de synchronisation commune, le verrou est l'objet d'instance actuel

Méthode de synchronisation statique, lock C'est l'objet de classe de la classe actuelle

bloc de méthode synchronisé, et le verrou est l'objet entre parenthèses

4. Quelle est la différence entre synchronisé et volatile ?

L'essence de volatile est de dire au jvm que la valeur de la variable actuelle dans le registre (mémoire de travail) est incertaine et doit être lue à partir de la mémoire principale, verrouille de manière synchronisée la variable actuelle et ; seul le thread actuel peut le faire. Lors de l'accès à cette variable, les autres threads sont bloqués.

volatile ne peut être utilisé qu'au niveau de la variable ; synchronisé peut être utilisé au niveau de la variable, de la méthode et de la classe.

volatile ne peut réaliser que la visibilité des modifications des variables et ne peut pas garantir l'atomicité tandis que synchronisé peut garantir la visibilité des modifications et l'atomicité des variables.

Volatile ne provoquera pas de blocage de thread ; synchronisé peut provoquer un blocage de thread.

Les variables marquées comme volatiles ne seront pas optimisées par le compilateur ; les variables marquées comme synchronisées peuvent être optimisées par le compilateur.

5. Quelle est la différence entre synchronisé et verrouillé ?

Tout d'abord, synchronisé est un mot-clé intégré à Java Au niveau jvm, Lock est une classe Java

Synchronized ne peut pas déterminer si l'état du verrouillage est acquis, mais Lock peut déterminer si le verrou est acquis ;

synchronisé libérera automatiquement le verrou (un thread libérera le verrou après l'exécution du code de synchronisation ; le thread b libérera le verrou si une exception se produit pendant l'exécution), Lock doit être libéré manuellement dans finalement (la méthode unlock() libère le verrou), Sinon, il est facile de provoquer un blocage du thread

Utilisez le mot-clé synchronisé pour deux threads 1 et 2. Si le thread actuel est 1 ; obtient le verrou, le thread 2 attendra. Si le thread 1 est bloqué, le thread 2 attendra indéfiniment, et le verrou Lock n'attendra pas nécessairement. Si le verrou ne peut pas être obtenu, le thread peut se terminer sans attendre

Le verrouillage synchronisé peut être répété. Saisissant, ininterrompu. , et injuste, tandis que les verrous Lock sont réentrants, jugeables et équitables (les deux sont possibles)

Les verrous Lock conviennent aux problèmes de synchronisation avec une grande quantité de code synchronisé, et les verrous synchronisés conviennent à de petites quantités de code ; problèmes de synchronisation.

(Recommandations du didacticiel associées : Introduction au développement Java)

6. Quelle est la différence entre synchronisé et ReentrantLock ?

synchronized est le même mot-clé que if, else, for et while, et ReentrantLock est une classe. C'est la différence essentielle entre les deux. Puisque ReentrantLock est une classe, il fournit des fonctionnalités de plus en plus flexibles que synchronisées. Il peut être hérité, peut avoir des méthodes et peut avoir diverses variables de classe. L'évolutivité de ReentrantLock par rapport à synchronisé se reflète en plusieurs points :

ReentrantLock peut définir le temps d'attente pour l'acquisition du verrou, évitant ainsi les blocages

ReentrantLock peut obtenir des informations sur différents verrous

ReentrantLock peut implémenter de manière flexible plusieurs notifications

De plus, le verrouillage les mécanismes des deux sont en réalité différents : ReentrantLock appelle la méthode Unsafe park pour verrouiller en bas, tandis que synchronisé devrait opérer sur le mot de marque dans l'en-tête de l'objet.

7. Parlez-moi du principe atomique ?

La caractéristique de base des classes du package Atomic est que dans un environnement multithread, lorsque plusieurs threads opèrent sur une seule variable (y compris les types de base et les types de référence) en même temps, ils sont exclusifs, c'est-à-dire que lorsque plusieurs threads mettent à jour la valeur de cette variable en même temps, un seul thread peut réussir et le thread qui échoue peut continuer à essayer comme un verrou tournant jusqu'à ce que l'exécution réussisse.

Les méthodes principales de la série de classes Atomic appelleront plusieurs méthodes locales dans la classe non sécurisée. Une chose que nous devons d'abord connaître est la classe Unsafe, dont le nom complet est : sun.misc.Unsafe. Cette classe contient un grand nombre d'opérations sur le code C, y compris de nombreuses allocations directes de mémoire et des appels à des opérations atomiques. est marqué comme non sécurisé, je vous dis qu'un grand nombre d'appels de méthodes comporteront des risques de sécurité et que vous devez les utiliser avec prudence, sinon cela entraînera de graves conséquences. Par exemple, lors de l'allocation de mémoire de manière non sécurisée, si vous spécifiez certaines zones, cela peut provoquer des problèmes similaires à ceux du C++. Le pointeur franchit la frontière vers d'autres processus.

Tutoriel recommandé :

questions d'entretien Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer