IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

[Thread] Priorités face à un bloc synchronisé


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut [Thread] Priorités face à un bloc synchronisé
    Bonjour,
    Mes questions existentielles continuent...

    Si on a un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    synchronized(mutex){
    ...
    }
    et que plusieurs threads arrivent au synchronized alors que le lock sur mutex est déja pris. Un fois qu'il sera libéré, est-ce que la priorité des threads qui attendent va jouer pour savoir qui ve prendre le lock, ou bien est-ce qu'on peut considérer le lock comme une pile fifo, a savoir le premier à être arrivé sera le premier a éxécuter le code dans le bloc synchronisé (comme c'est le cas apparemment en .NET) ?
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  2. #2
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.
    Bonne question.

    Intuitivement, je pencherais pour que les threads à plus haute priorité passent devant, avec du "pur hasard" pour départager les threads de priorité équivalente.

    Mais je suis persuadé que Gfx va nous sortir le numéro du chapitre, dans les specs de la jvm, qui dit comment une jvm doit gérer ça
    Glob
    What would you do if you were not afraid?

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  3. #3
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 103
    Points : 128
    Points
    128
    Par défaut
    si cela se trouve ca va dépendre de la JVM et/ou de l'OS

    juste au cas ou, pour faire mumuse avec des tread sous java , l'api Concurent Java est tres puissante. Inclue dans Java5 dispo sous forme de jar pour 1.4 .

    http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html

  4. #4
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Hé bien non, ton intuition était fausse Glob apparement.

    voici un petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import static java.lang.Thread.*;
     
    public class Test implements Runnable {
    	private static Object mutex = new Object();
    	private int numero;
     
    	public static void main(String[] args) {
    		Thread[] threads = new Thread[3];
    		for (int i = 0; i < 3; i++) {
    			threads[i] = new Thread(new Test(i));
    		}
     
    		threads[0].setPriority(MAX_PRIORITY);
    		threads[1].setPriority(NORM_PRIORITY);
    		threads[2].setPriority(MIN_PRIORITY);
     
    		for (Thread thread : threads){
    			thread.start();
    		}
     
    	}
     
    	public Test(int i) {
    		this.numero = i;
    	}
     
    	public void run() {
    		while (true) {
    			synchronized (mutex) {
    				System.out.println(numero);
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
     
    	}
     
    }
    On pourrait s'attendre à voit sur la sortie plus de 0 que de 1 et plus de 1 que de 2.
    Pourtant la sortie indique :
    0
    1
    2
    0
    1
    2
    0
    1
    2
    ...

    Donc apparemment le lock est comme une pile FIFO. Je retrouve le même comportement qu'en .NET.

    Maintenant, a savoir si ça dépend de la JVM... A fouiller.

    Une question me reste... Comment dans un cas comme ça, faire en sorte qu'un thread avec une plus haute priorité ait plus de chance d'exécuter le bloc synchronisé.
    Que rajouter ??
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Regarde dans les codes source, j'avais posté un mutex de ce genre.ici
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Pas bête.

    ça correspond à un design pattern connu, ou c'est un truc de ton cru ?

    Edit : ça pose quand même un pb. En utilisant tel quel, les threads de faible priorité n'ont plus aucune chance de passer non ?
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Ben l'héritage des priorités c'est pas de moi, c'est assez connu.

    Après, pour toi, la chose intéressante, c'est la file d'attente ordonnée. Mais si tu synchronises des threads de priorités différentes, tu peux avoir à te pencher sur l'inversion des priorités.

    Et oui, c'est assez basique comme mutex. Les faibles priorités passent quand les fortes priorités ont fini. Il y aurait peut etre moyen de coder un Comparator qui tienne compte du temps d'attente, afin que l'ancienneté joue dans l'ordre de la file d'attente, et pas seulement la priorité.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 103
    Points : 128
    Points
    128
    Par défaut
    dans la lib Concurency :

    Sync
    Interface for classes used as exclusion, resource management, and related synchronization aids, supporting methods acquire, attempt(msecs), and release.

    Implementations

    Semaphore
    Default implementation of Semaphores, providing no special ordering guarantees.
    WaiterPreferenceSemaphore
    Provides protection against barging (infinite overtaking)
    FIFOSemaphore
    Provides first-in/first-out ordering
    PrioritySemaphore
    Prefers notifications to higher-priority threads
    Mutex
    Basic non-reentrant mutual exclusion lock
    ReentrantLock
    Java-style per-thread mutual exclusion lock
    Latch
    A condition that is acquirable forever more after the first release
    CountDown
    A condition that is acquirable forever more after the nth release.


    en fouillant, tu vas surement t'approcher de ton besoin , enfin peut etre.

  9. #9
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    D'apres ce que j'ai pu lire dans la spec (chapitre 17) et dans les articles suivants (plus faciles a lire surtout aussi tard , l'ordre d'execution des threads dans le pool d'attente (qui n'est donc pas forcement une file) d'un bloc synchronized depend de l'implementation.

    http://www.artima.com/insidejvm/ed2/threadsynch.html http://www.eecs.berkeley.edu/~jimy/java/rendezvous/

    Chapitre 17 : http://java.sun.com/docs/books/jls/third_edition/html/memory.html#56318
    Romain Guy
    Android - Mon livre - Mon blog

  10. #10
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Excellent, tout y est.
    Merci.

    J'ai pas mal de curiosité sur certain sujets mais sur le net je suis comme dans la rue : impossible de trouver mon chemin, c'est maladif.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  11. #11
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    On te pardonne, c'est interessant de lancer ce genre de discussion sur le forum. Java a beau etre un langage (relativement) simple, il y a beaucoup de subtilites et de details interessants.
    Romain Guy
    Android - Mon livre - Mon blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ThreadPool priorité - process - thread
    Par stephane.julien dans le forum C#
    Réponses: 3
    Dernier message: 03/04/2008, 10h15
  2. problème de priorité des threads
    Par wauant dans le forum C
    Réponses: 4
    Dernier message: 18/04/2007, 08h51
  3. problème de priorité des threads
    Par wauant dans le forum Développement
    Réponses: 1
    Dernier message: 12/04/2007, 10h49
  4. Réponses: 14
    Dernier message: 14/12/2006, 08h34
  5. [Astuce][Thread]Utilisation des blocs synchronized
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 14
    Dernier message: 21/07/2004, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo