J'ai eu un tableau 2x2 que j'ai eu deux threads fonctionnant sur.
Il est possible d'utiliser une instruction synchronisée dans Java sur un tableau? P>
Comment fonctionne-t-elle? Le fil de didacticiel Java a déclaré que l'instruction synchronisée fonctionne sur des objets, alors je ne savais pas ce qu'ils voulaient dire. Un autre site a déclaré que je pouvais faire une déclaration comme p>
synchronized (array1[i][j]){ }
4 Réponses :
Non, la synchronisation de cette façon signifie que vous verrouillez sur l'objet Array, non pas que vous synchronisez réellement l'accès à ses méthodes. Si votre matrice est visible pour les autres, ils peuvent toujours accéder à l'accès / modifier son contenu, qu'il soit enfermé ou non. Seulement ils ne peuvent pas le verrouiller en même temps - s'ils tentent de (à partir d'un fil différent), ils seront bloqués jusqu'à ce que le verrou soit libéré par son acquéreur d'origine.
Si vous voulez vous assurer qu'un seul fil Est accessible à votre tableau (ou un élément de celui-ci) à la fois, vous devez l'encapsuler dans une classe et synchroniser toutes les méthodes de classe publique qui manipulent la matrice. (Vous pouvez verrouiller le tableau à cette fin, cependant, si vous le souhaitez - l'approche plus simple et habituelle consiste à déclarer les méthodes elles-mêmes comme synchronisé code>, auquel cas leur contenu est synchronisé sur
Ce code>, l'objet enfermé). P>
class ArrayWrapper {
private int[] array = ...;
public void setValue(int index, int value) {
synchronized (array) {
array[index] = value;
}
}
public int getValue(int index) {
synchronized (array) {
return array[index];
}
}
...
}
+1: Il est généralement une bonne idée de créer un champ que vous utilisez comme verrouillage final code>. S'il ne peut pas être
final code>, vous pourriez avoir un bug.
Je viens de mettre en œuvre de cette façon, d'écrire mon premier bit de synchronisé code> et il a corrigé mon bogue, alors merci.
Le mot clé Synchronisé code> fonctionne uniquement avec des objets. P>
Synchronisation sur le tableau uniquement uniquement sur le tableau (en Java, une matrice est un objet). p>
Si vous synchronisez sur un élément individuel de la matrice, supposant qu'ils sont des objets et non des primitives, c'est une autre serrure différente. Vous pouvez en avoir un sans l'autre et l'inverse est également vrai. Vous ne pouvez pas vous synchroniser sur une primitive. P>
Si vous devez empêcher la modification simultanée de la matrice, synchronisez-vous sur certains objets dans
Oui, vous pouvez synchroniser à l'aide d'une matrice comme objet Moniteur, car des tableaux (même des matrices de primitives) sont des objets en Java.
Vous pouvez synchroniser un bloc de code sur un moniteur spécifique comme celui-ci: P> < Pré> xxx pré>
Il est préférable de se startroniser comme peu de lignes de code que possible. p>
Le code de synchronisation sur un moniteur n'affecte aucune manière sur le moniteur, il n'affecte que les threads. accéder au bloc de code synchronisé. Avant que l'exécution du thread ne puisse entrer dans le bloc de code, il doit obtenir «le verrouillage» sur le moniteur. Le jeu d'exécution Java garantit qu'au plus d'un fil à un moment peut avoir «le verrouillage» sur un moniteur. SO SE SYNCHRONISATION SE SE SE SYNCHRONISANT SUR VOTRE ARRAY n'interdit pas de blocs de code non synchronisé pour y accéder! STRUT> L'astuce consiste à vous assurer que toutes les opérations que vous ne voulez pas se passer en même temps sont à l'intérieur des blocs synchronisés sur le Même moniteur. P> Puisque Java n'offre pas de tableaux multidimensionnels, seuls des tableaux de tableaux, vous pouvez certainement se synchroniser sur un tableau imbriqué pour une synchronisation à grain plus fine. Si vous modélisez un tableau 2D en tant que tableau de lignes, vous ne pouvez synchroniser que sur les lignes et non sur des colonnes car, dans ce cas, des colonnes ne sont pas représentées sous forme de réseaux distincts. p> Vous ne pouvez synchroniser que sur des valeurs de tableau unique s'il s'agit de non-primitve, donc entier () au lieu de Int. Notez que Integer () est un objet immuable, vous ne pourrez donc pas modifier sa valeur. Une solution serait de créer votre propre objet wrapper cellule () avec un getter et un setter pour la valeur numérique contenue. Cela vous permettrait de laisser un thread à obtenir une serrure sur la cellule et de changer sa valeur en toute sécurité. P> Parce que c'est mon jour de congé, j'ai décidé de m'amuser et de créer un exemple de travail de ce que vous décrivez. Oui, c'est mon idée de s'amuser. P> classes: p> L'application commence plusieurs opérations sur la même matrice. Le seul bloc de code synchronisé est dans l'opération de classe. Si vous supprimez la synchronisation, les résultats seront faux car deux opérations manipulent simultanément la même ligne simultanément. P> sortie lorsqu'il est synchronisé: p> exemple de sortie lorsque Non synchronisé: p> Notez que j'ai ajouté des énoncés de thread.sleep () dans les implémentations de fonctionnement pour faire la différence entre l'exécution synchronisée et non éventuelle plus évidente. P> < / p>
Vous ne pouvez pas vous synchroniser sur les primitives. Un bloc synchronisé nécessitait un objet afin qu'il puisse utiliser sa serrure associée.
Où ai-je dit que vous pouvez synchroniser sur les primitives?
Salut. Je ne voulais pas sonner méchant, vient de voir votre première ligne "Oui, vous pouvez synchroniser à l'aide d'un tableau en tant que moniteur, car des tableaux (même des primitives) sont des objets en Java." Vous avez dit que vous pouvez synchroniser des tableaux parce qu'ils sont des objets. C'est exact. Mais a également ajouté que les primitives d'événements sont menacées comme des objets, mais ils ne le sont pas. Cordialement, Tiberiu.
Merci pour la clarification, j'ai mis à jour ma réponse à Disambiguez.
Lorsque vous synchronisez un objet ou une matrice, vous empêchez un autre thread de la synchronisation du même objet. Cela ne vous empêche pas d'utiliser l'objet et aucune autre opération n'est "verrouillée" Vous devez vous assurer que vous avez enfermé l'objet d'abord de manière cohérente, de «verrouiller» l'objet. P>