J'ai un "simple" 4 exemple de classe de manière fiable que montre un comportement inattendu de java synchronisation sur plusieurs machines. Comme vous pouvez le lire ci-dessous, étant donné que le contrat de java sychronized
mot-clé, Broke Synchronization
ne doit jamais être imprimé à partir de la classe TestBuffer.
Voici les 4 classes qui vont reproduire le problème (au moins pour moi). Je ne suis pas intéressé par la façon de corriger ce mauvais exemple, mais plutôt pourquoi il se casse en premier lieu.
Le Problème De Synchronisation - Controller.java
Le Problème De Synchronisation - SyncTest.java
Le Problème De Synchronisation - TestBuffer.java
Le Problème De Synchronisation - Tuple3f.java
Et voici le résultat que j'obtiens quand je le lance:
java -cp . SyncTest
Before Adding
Creating a TestBuffer
Before Remove
Broke Synchronization
1365192
Broke Synchronization
1365193
Broke Synchronization
1365194
Broke Synchronization
1365195
Broke Synchronization
1365196
Done
Mise à JOUR: @Gray est l'exemple le plus simple que les pauses jusqu'à présent. Son exemple peut être trouvé ici: Étrange JRC Condition de Course
Basé sur les commentaires que j'ai obtenu d'autres, il semble que le problème peut se produire sur Java 64 bits 1.6.0_20-1.6.0_31 (pas sûr parler de nouvelle 1.6.0) sur Windows et OSX. Personne n'a été en mesure de reproduire le problème sur Java 7. Il peut aussi demander un multi-core de la machine à reproduire le problème.
QUESTION DE DÉPART:
J'ai une classe qui fournit les méthodes suivantes:
- supprimer - Supprime l'élément donné de la liste
- getBuffer - Itère sur tous les éléments de la liste
J'ai réduit le problème à l'2 fonctions ci-dessous, qui sont tous deux dans le même objet, et ils sont tous les deux synchronized
. Sauf erreur de ma part, "Cassé la Synchronisation" ne devrait jamais être imprimé car insideGetBuffer
doivent toujours être mis dos à faux avant remove
peuvent être saisis. Cependant, dans mon application, c'est l'impression de "Fait de la Synchronisation" lorsque j'ai 1 thread appelant supprimer à plusieurs reprises tandis que l'autre appelle getBuffer à plusieurs reprises. Le problème est que je reçois ConcurrentModificationException
.
Voir Aussi:
Très étrange condition de course qui ressemble à un JRE problème
Soleil De Rapport De Bug:
Cela a été confirmé comme un bug en Java par Sun. Il est apparemment résolu (sans le savoir?) dans jdk7u4, mais ils n'ont pas intégré le fixer à jdk6. Bug ID: 7176993