Synchronisation Thread
Résolu/Fermé
luchywa
Messages postés
186
Date d'inscription
mercredi 11 novembre 2009
Statut
Membre
Dernière intervention
6 avril 2017
-
Modifié par KX le 30/05/2015 à 09:52
luchywa Messages postés 186 Date d'inscription mercredi 11 novembre 2009 Statut Membre Dernière intervention 6 avril 2017 - 30 mai 2015 à 22:32
luchywa Messages postés 186 Date d'inscription mercredi 11 novembre 2009 Statut Membre Dernière intervention 6 avril 2017 - 30 mai 2015 à 22:32
A voir également:
- Synchronisation Thread
- Synchronisation calendrier outlook gmail - Guide
- Logiciel de synchronisation - Télécharger - Sauvegarde
- Synchronisation de la ligne adsl free ✓ - Forum Freebox
- Synchronisation des dossiers avec abonnement - Forum Mail
- Erreur synchronisation livebox ✓ - Forum Livebox
1 réponse
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
30 mai 2015 à 10:07
30 mai 2015 à 10:07
Bonjour,
Le mot clé synchronized sur une méthode comme tu l'as fait mets un verrou sur l'objet courant. Or tu as deux objets distincts thread et thread2.
Quand incr() est verrouillée pour thread, elle ne l'est pas pour thread2 et inversement. Pour que ton code fonctionne, il faut qu'il y ait une synchronisation sur le même élément.
Le plus simple est de verrouiller la classe, en rajoutant le mot clé static à la méthode synchronized, l'élément commun sera alors la classe.
On peut également partager un objet commun qui fera l'action incr(), les deux threads se synchroniseront sur cet objet.
Le mot clé synchronized sur une méthode comme tu l'as fait mets un verrou sur l'objet courant. Or tu as deux objets distincts thread et thread2.
Quand incr() est verrouillée pour thread, elle ne l'est pas pour thread2 et inversement. Pour que ton code fonctionne, il faut qu'il y ait une synchronisation sur le même élément.
Le plus simple est de verrouiller la classe, en rajoutant le mot clé static à la méthode synchronized, l'élément commun sera alors la classe.
public static synchronized void incr() {
On peut également partager un objet commun qui fera l'action incr(), les deux threads se synchroniseront sur cet objet.
class ActionSynchro { public synchronized void incr() { for (int i = 0; i < 3; i++) { System.out.println("-----"); System.out.println("----------------------------------------------"); try { Thread.sleep(1000); } catch (InterruptedException e) { } } System.out.println("fini"); } } class ThreadSynchro extends Thread { private final ActionSynchro action; public ThreadSynchro(ActionSynchro action) { this.action = action; } @Override public void run() { action.incr(); } } public class TestSynchro { public static void main(String[] args) { ActionSynchro commun = new ActionSynchro(); ThreadSynchro thread1 = new ThreadSynchro(commun); thread1.start(); ThreadSynchro thread2 = new ThreadSynchro(commun); thread2.start(); } }
30 mai 2015 à 22:32