Le Touilleur Express

  • Accueil
  • A propos de l’auteur
  • A propos du Touilleur Express

Synchronisation avec Vector,Hashtable,HashMap et ArrayList

4 février, 2004

Tout d’abord un peu de théorie. Les class Vector et Hashtable sont des classes dont les accès sont synchronisés. Si 2 Threads manipulent un Vector, nous sommes sûrs que l’état de ce Vector est consistant et nous n’avons pas de problèmes d’accès concurrents. Ensuite Java 2 a introduit un nouvel ensemble de class « Collections » qui sont un formalisme de l’interface Collection et de l’interface Map. Ainsi la class Hashtable dans Java 2 implémente l’interface Map, et la class ArrayList est identique à la class Vector. Il y a cependant une différence de taille: ces nouvelles classes ne sont pas synchronisées. Un object ArrayList sans protections particulières de notre part, n’est pas synchronisé.

Quel est l’intérêt ?
A partir du moment où la m©thode add(Object O) de la class ArrayList par exemple n’est pas synchronisé, vous pouvez maintenant effectuer plusieurs opérations au sein d’un bloc synchonized dans votre code.
Exemple:
Dans cet exemple simpliste nous voulons ajouter 1 objet à la fois dans un Vector. Une autre thread est susceptible d’utiliser la méthode getLastest ici. Comme la class Vector est synchronisé il n’est pas
nécessaire et même inutile de rajouter 2 synchronized sur nos méthodes. Cela reviendrait à avoir
2 synchronisations imbriquées avec un risque d’interbloquage.

private Vector list=new Vector();

public void storeId(Object first){
	list.add(first);
}

public Object getLastest() {
	return list.lastElement();
}

Cependant si nous voulons enregistrer 2 objets à la fois à l’aide d’une seule méthode et que notre getLastest() ne puisse retourner une valeur qu’une fois nos 2 ajouts effectués alors nous aurions le code suivant:

private Vector list=new Vector();

public synchronized void storeIds(Object first,Object second){
	list.add(first);
	list.add(second);
}

public synchronized Object getLastest() {
	return list.lastElement();
}

et là nous avons un soucis. En entrant dans la méthode storeIds, Java acquiert un verrou et bloque la lecture sur ce vecteur. Ensuite lorsque nous effectuons nos 2 opérations add() nous avons à chaque fois un autre verrou qui est inutile…

La solution est d’utiliser un objet ArrayList non-synchronisé et de synchroniser nous-même les accès. A noter que l’instance est privée car nous ne voulons pas qu’une autre class référence directement notre liste. En règle générale le référencement externe des variables d’instance d’une class est quelque chose à éviter. Autant refaire du C sinon.

private ArrayList list = new ArrayList();

public void storeIds(Object first,Object second){
	synchronized(list){
		list.add(first);
		list.add(second);
	}
}

public synchronized Object getLastest() {
	synchronized(list){
		return list.lastElement();
	}
}

Voili voilà…

Articles similaires:

Default ThumbnailAPI pour les Threads, la Synchronisation, les ThreadPool Default ThumbnailEt si on regardait ce qu'il y a dans cette HashMap ? Default ThumbnailQuelle est la différence entre un Iterator et une Enumeration ? Default ThumbnailPourquoi le pattern lazy initialization ne marche pas

Derniers articles

  • Vis ma vie de Staff/Principal Engineer

    Suite de l’article précédent sur le Staff Engineer. Aujourd’hui, voyons un peu

    20 juillet, 2022
  • Inari

    Devenir Staff Engineer : comment et pourquoi ?

    Après une dizaine d’années en tant que développeur, vous serez un jour

    17 juillet, 2022
  • WeAreDevelopers 2022, conférence à Berlin – jour 1

    Il est 8h40, 19 degrés, vous êtes à Berlin. La queue dehors

    24 juin, 2022

Tweets @nmartignole

  •  @fanf42  Excellent 👌

    6 hours ago
  • RT  @iambdxoul :  @TheHackersNews  Lmao

    1 day ago
  • RT  @PR0GRAMMERHUM0R : Finally a GPT feature useful for work https://t.co/8U9FSUwKg5 https://t.co/GkUIJi7qtW

    1 day ago

Mots clés

Apple (32) Architecture (13) Big Data (5) Conference (8) Devoxx (55) Dev Web (37) Doctolib (2) geekevent (1) groovy (2) Innoteria (11) Java (517) Linux (10) Non classé (14) Perso (266) Recrutement (3) Scala (30) scrum (43) Société (3) Startup (20) Web 2.0 (67)

Le Touilleur Express

Blog par Nicolas Martignole

Contactez-moi : nicolas@touilleur-express.fr

Suivez-moi sur Twitter : @nmartignole

Copyright© 2008 - 2020 Nicolas Martignole | Tous droits réservés
  • A propos de l’auteur
  • A propos du Touilleur Express
  • Log In
  • My Account
  • My Profile
  • Reset Password

Le Touilleur Express