2017-09-29 1 views
0

Pour mon problème/question plus facile à comprendre, je vais le mettre dans une liste à puces:Le cache java peut-il se déclencher lorsque le thread n'est pas mis en veille manuellement?

  • disposent d'un éventail volatile.
  • Les données sont définies sur ce tableau à partir de plusieurs threads, mais les threads ne s'exécutent JAMAIS en même temps.
  • J'ai un code comme ça dans l'un des fils (qui n'exécute pas en parallèle):

    { myArray[0] = myData; sleep(1); doSomething(myArray[0]); }

  • Maintenant parfois (assez bien reproductible) se produit que doSomething() ne reçoit pas myData mais à la place des données définies une fois dans un autre thread!

Je suis assez sûr qu'il ya le mécanisme de mise en cache Java frappe ici, car même si le tableau est volatile, il est des éléments peuvent bêtement pas être volatile.

Cette section de code est très critique de vitesse donc je voudrais vraiment éviter d'utiliser AtomicReferenceArray car je n'ai pas besoin non plus de fonctionnalité atomique.

Cependant, ce n'était qu'une coïncidence (but de débogage) que j'avais sleep() juste là. Ce n'est pas nécessaire. MAIS je sais que le CPU ou Windows allume/allume aléatoirement les threads de toute façon. Donc, cela signifie-t-il que sans cela, je pourrais rencontrer ce problème à long terme et avec de la malchance? Il ne s'est pas produit dans ~ 20 minutes de test au moins. Cela signifie-t-il que la JVM (et sa mise en cache) fonctionne différemment si le processeur change son thread et que je ne le fais pas dormir moi-même?

Si le premier est le cas, quelqu'un a-t-il des suggestions pour éviter ce problème?

Un grand merci d'avance!

Répondre

0

Si vous êtes sûr que Threads ne s'exécute pas en parallèle. Pourriez-vous écrire la ligne de code 3 dans le bloc synchronisé?

Comme toutes les variables qui sont en bloc synchronisé, rafraîchissez la valeur de la mémoire principale. Ainsi, vous obtiendrez une valeur actualisée la plus récente.

+0

Merci pour la réponse rapide! Malheureusement, aucun changement de comportement ... Êtes-vous sûr que cette actualisation s'applique également aux éléments à l'intérieur des tableaux? Je vais exporter les parties cruciales dans un projet séparé, mais je suis à peu près sûr qu'elles ne fonctionnent pas en parallèle car en fait l'ensemble initial n'est appelé qu'une seule fois. – DragonGamer

+0

Argh, okey, peu importe tout ça q__q C'était un bug complètement stupide car j'avais une fonction fonctionnant à travers ~ 3 fonctions sur ce tableau appelé dans un hover-event de JavaFX (qui tourne sur son propre thread). Bon sang, j'étais presque sur le point de me méfier que l'erreur apparaisse toujours quand je jouais avec l'interface graphique ... Eh bien, facilement 3 heures gaspillées ... Merci beaucoup de prendre votre temps et d'essayer d'aider! – DragonGamer