De nombreux threads peuvent remplir un se demande Si une telle chose existe déjà, je déteste réinventer les roues. P> p> HASHMAP code>, dans certains cas, je dois attendre (bloc) jusqu'à ce qu'un objet existe dans le hashmap, tel que:
5 Réponses :
Je ne suis pas sûr de votre question. Voulez-vous attendre la valeur quand ce n'est pas sur la carte? Vous voulez le modèle de producteur-consommateur de blocageQueue sur une carte. Si c'est que je ne connais rien de même dans le JRE ou nulle part ailleurs. P>
Google Guava MapMaker vous permet de créer une carte informatique, c'est une carte qui crée la valeur si elle n'existe pas en utilisant une usine avec la fonction de type
MMM ... La carte informatique pourrait être un bon démarrage en réalité, en ce que la fonction code> pourrait simplement encapsuler le blocage jusqu'à présent sur la carte. C'est un moyen relativement agréable de séparer l'aspect "Blocking" de l'aspect "Carte" et permet également de multiples stratégies tout simplement (par exemple, Spinning vs. dormant vs endormi vs attente-notifall contre ...)
Je suis en désaccord, andrzej. C'est une alternative, pas un bon départ. Le fil qui atteint la fonction doit renvoyer une valeur, il ne peut pas attendre un délai d'attente, ni le reste des lecteurs.
Merci pour l'idée, je vais y regarder. Et oui, je dois attendre une période de temps spécifiée (ou indéfiniment) jusqu'à ce qu'une clé spécifiée existe sur la carte, puis continue comme une opération d'obtention (clé) normale.
Autant que je sache, il n'y a pas de «carte de transfert» disponible. Bien que la création d'une théorie n'est pas trop difficile. Il existe des exclusions évidentes dans cette classe. Ne pas mentionné la serrure aboryant; Inutile de dire que cela ne fonctionnera pas bien, mais vous devriez avoir l'idée de ce qui se passe p> p>
Même question que dans la réponse de l'irreputable: la synchronisation autour de MET (Key, Val) est logique, je peux voir de nombreuses options de mise en œuvre pour améliorer les performances si nécessaire (même si cette affaire n'a pas de problème de performance). Mais la question est la suivante: puis-je compter sur Mettre (clé, Val) toujours appelée à chaque opération de mise? Il y a 3 méthode de vente: mettre (k, v), putaall (colection) et putifabsent (k, v).
Amélioration de l'IPL de John, avec la destination visée (), au lieu de "troupeau tonnerre", qui est particulièrement mauvais lorsque personne n'attend sur une clé insérée
HashMap<K,Object> locks = new HashMap<>(); put(key, value) synchronized(locks) backingMap.put(key,value); lock = locks.get(key); if(lock!=null) lock.notifyAll(); getAndWait(key) // not hard, but pretty verbose
+1 J'aime la référence du troupeau tonnerning. C'est un nouveau terme pour moi :)
C'est un terme aussi vivant que vous n'oublierez jamais une fois que vous l'avez entendu.
Je suis d'accord et je suis absolument approprié de la situation de sa décrire
Synchronisation autour de Met (Key, Val) a du sens, je peux voir de nombreuses options de mise en œuvre pour améliorer les performances si nécessaire (même si cette affaire n'a pas de problème de performance). Mais la question est la suivante: puis-je compter sur Mettre (clé, Val) toujours appelée à chaque opération de mise? Il y a 3 méthode de vente: mettre (k, v), putaall (colection) et putifabsent (k, v).
J'aime cette idée, mais un exemple de travail au lieu de pseudocode aurait été plus utile; Surtout que la synchronisation est impliquée.
Vous pouvez remplir votre Vous ne voulez probablement pas qu'un seul thread récupère les résultats car cela pourrait attendre sur la tâche qui se termine pour finir en dernier. Vous pouvez avoir plusieurs threads de récupération, ou vous pouvez parcourir les touches lorsque vous attendez une tâche trop longue pour une tâche (il existe une méthode HASHTABLE code> avec
java.util.concurrent.futuleTask
futuretask code> s. Vous pouvez obtenir vos résultats asynchroniquement avec
objreturned obj = hashtable.get (clé) .get () code>, qui attendra si le
futuretask code> en question n'est pas encore terminé. p>
futueTask.get (WAITTIME, TIMEUnit) code>). p>
BlockingMap4J conviendra exactement à vos besoins.
Vous pouvez le trouver chez https://github.com/sarveswaran-m/blockingmap4j/wiki/
Étant donné que les verrous granulaires sont utilisés dans la mise en œuvre, les performances ne seront pas gravées gravement dégradées. P>
PS B>
C'est une réponse assez tardive sur une question de 2 ans. Depuis, il n'ya aucun moyen d'envoyer un message privé à l'auteur de la question, réponds ici. P>
Disclaimer B>
Je suis l'auteur de la bibliothèque. P>
Vous devriez ajouter un clause de non-responsabilité indiquant que vous êtes l'auteur de cette bibliothèque.
@assylias - Non, ce n'est pas nécessaire. C'est un lien vers un projet Open Source i>, donc un conflit d'intérêts. La question semble avoir demandé des solutions existantes. Si vous avez technique i> préoccupation avec cette solution, postez-la - sinon cela n'a pas vraiment d'importance qui l'a suggéré.
@Chrisstratton pour le dossier que j'avais suscité la réponse et oui, les directives de Stackoverflow disent que L'utilisateur devrait décliner son affiliation .