Pour un exemple réel,
supposons que vous vouliez mettre en œuvre asynchrone de journalisation, où les threads que voulez enregistrer quelque chose, vous ne voulez pas attendre pour leur message de journal pour obtenir "publié" (dire, écrire dans un fichier), juste aussi longtemps que il a finalement fait (parce qu'ils ont un réel travail à faire.)
Producer(s):
concurrentQueue.push("Log my message")
Et dire, vous décidez d'avoir un dédié thread consommateur, qui est le seul responsable pour écrire des messages dans un fichier log:
(Single)Consumer
while (concurrentQueue.isEmpty())
{
//what should I do?
}
writeToFile(concurrentQueue.popHead());
//loop
La question est de savoir quoi faire dans l'intérieur de l'en bloc? Java n'a pas fourni de solution idéale: vous pourriez faire un Thread.sleep(), mais pour combien de temps et c'est lourd; ou d'un Fil.rendement(), mais c'est spécifié, ou vous pouvez utiliser un verrou ou d'un mutex*, mais c'est souvent trop lourd et ralentit les producteurs à la baisse (et vicie le but déclaré de l'asynchrone de journalisation).
Ce que vous voulez vraiment est-à-dire au moment de l'exécution, "je pense que je ne vais pas attendre trop longtemps, mais je tiens à minimiser les frais généraux en attente/effets négatifs sur d'autres threads".
C'est là que le Fil de discussion.onSpinWait() est livré dans.
Comme une réponse ci-dessus indiqué, sur les plates-formes compatibles (comme x86), onSpinWait() obtient intrinsified en PAUSE d'instruction, qui vous donnera les avantages que vous voulez. Donc:
(Single)Consumer
while (concurrentQueue.isEmpty())
{
Thread.onSpinWait();
}
writeToFile(concurrentQueue.popHead());
//loop
Il a été démontré empiriquement que cela peut améliorer la latence de "occupé-attendre" style de boucles.
Je tiens également à préciser que ce n'est pas seulement utile dans la mise en œuvre de "spin-serrures" (même si c'est vraiment utile dans une telle circonstance); le code ci-dessus ne nécessite pas de verrouillage de spin (ou autre) de toute nature.
Si vous souhaitez vous lancer dans les mauvaises herbes, vous ne pouvez pas faire mieux que Intel specs
*Pour plus de clarté, la JVM est incroyablement intelligent, dans une tentative de minimiser le coût de mutex, et utilisera léger serrures début, mais c'est un autre débat.