Das Java-Speichermodell macht deutlich, was über die Interaktion von Threads durch den Speicher angenommen werden kann und was nicht. Wenn beispielsweise ein Thread einen neuen Wert ohne entsprechende Synchronisation in ein Feld schreibt, ist nicht garantiert, dass der neue Wert von anderen Threads beobachtet werden kann. In der Praxis könnten jedoch andere Threads den neuen Wert trotz unzureichender Synchronisation lesen, abhängig von der Zeit zwischen Schreiben und Lesen, der Hardwarearchitektur usw.
Dies kann zu Fehlern führen, die schwer zu entdecken und schwer zu reproduzieren sind. Es könnte daher nützlich sein, eine Java-Anwendung auf einer Worst-Case-JVM auszuführen, die absolut keine Speichersynchronisierung zwischen Threads außerhalb der Garantien im Java-Speicher vorgenommen hat Modell . Gibt es solch eine JVM-Implementierung im schlimmsten Fall?
Sie könnten versuchen, Terracotta zu verwenden, um Ihr Programm zu bündeln. Es ist unglaublich unversöhnlich um falsche Synchronisation (die sich selbst mit nur einem Knoten im Cluster zeigt). Das ist eine große Frage: Ich habe oft genau diese Fähigkeit gesucht - ich bin überrascht, dass es keinen Wechsel in der Standard JRE -XXJMMExtreme
Terrakotta ist Open-Source und kostenlos für das Basisprodukt.
Ich kenne keine VM, die das Worst-Case-Verhalten die ganze Zeit garantiert, was das zu sein scheint, was Sie verlangen. Die Situation, die Sie beschreiben, kann bei Sun VMs (und vielen anderen) auftreten, jedoch nur aufgrund von Caching-Problemen. Ich bin nicht vertraut mit einer VM, die dies absichtlich die ganze Zeit tut.
Es gibt viele Möglichkeiten, die einen Nebenläufigkeitsfehler auslösen könnten.
Im schlimmsten Fall JVM, versuchen Sie ein Mobiltelefon. (Ihre Anwendung wird wahrscheinlich überhaupt nicht funktionieren);)
Synchronisationsfehler sind normalerweise schwer zu reproduzieren, da sie von subtilen Timings zwischen verschiedenen Threads abhängen, so dass keine Implementierung, die tatsächlich versucht, "nur Ihr Programm auszuführen", immer "schlimmstmöglich" sein kann. Sie können nicht mehr als eine unterschiedliche Art reproduzieren, wie zwei Threads ihre Anweisungen verschachteln können, wenn Sie diese Anweisungen nur einmal ausführen. Das Testen all dieser Kombinationen in einem einzigen Lauf ist noch weniger möglich. Eines der anderen Poster schlug Java Pathfinder vor und das klingt nach einer guten Idee - aber beachte, dass es sich um eine App handelt, die denselben Code viele Male ausführt, also kann man sie nicht einfach als eine andere JVM-Implementierung behandeln.
Ein weiterer praktischer Tipp besteht darin, zu versuchen, die App auf so vielen verschiedenen JVMs wie möglich auszuführen. Probieren Sie verschiedene Hersteller, verschiedene Versionen desselben Herstellers, verschiedene CPU-Architekturen und so weiter aus. Vor ein paar Jahren hatte ich Erfahrung mit einer Multithread-basierten App, die auf Suns JVM auf Xeon-CPUs entwickelt, getestet und ausgeführt wurde, wo es sehr gut funktionierte. Irgendwann habe ich versucht, es auf IBMs J9 Java Virtual Machine auf der POWER-Architektur laufen zu lassen und auf den ersten Blick sind etwa 2/3 der Tests aufgrund von Synchronisationsfehlern fehlgeschlagen. Daher kann das Testen in verschiedenen Umgebungen ziemlich gut darin bestehen, versteckte Synchronisierungsprobleme aufzudecken.
Tags und Links java memory multithreading synchronization jvm