Frage

Ich frage mich, was es gute Möglichkeiten, Aussagen über Synchronisation oder etwas machen würden, so dass ich Verletzungen Synchronisation erkennen konnte (während des Tests).

Das wäre für den Fall, zum Beispiel verwendet werden, dass ich eine Klasse haben würde, das nicht Thread-sicher ist und das ist nicht Thread-sicher sein würde. Mit gewisser Weise würde ich eine Behauptung, die mich informieren würde (log oder etwas), wenn einige Methode (n) davon von mehreren Threads aufgerufen wurde.

Ich bin die Sehnsucht nach etwas ähnlichem, die für AWT Dispatch Thread mit dem folgenden gemacht werden:

public static void checkDispatchThread() {
    if(!SwingUtilities.isEventDispatchThread()) {
        throw new RuntimeException("GUI change made outside AWT dispatch thread");
    }
}

Ich würde nur etwas allgemeinere wollen. Die Problembeschreibung ist nicht so klar, aber ich hoffe, dass jemand ein paar gute Ansätze hat =)

War es hilfreich?

Lösung

Sie werden nach dem heiligen Gral suchen, denke ich. AFAIK es nicht vorhanden ist, und Java ist keine Sprache, die ein solcher Ansatz erlaubt auf einfache Weise erstellt werden.

"Java Concurrency in Practice" hat einen Abschnitt über Tests für threading Probleme. Es zieht besondere Aufmerksamkeit darauf, wie schwer es ist, zu tun.

Andere Tipps

Wenn ein Thema über Threads in Java entsteht es in der Regel Erkennung verwendet ist in einer Sackgasse, mehr als nur die Überwachung, welche Themen sind einen synchronisierten Abschnitt zur gleichen Zeit zugreifen. JMX Erweiterung, da 1,5 bis JRE hinzugefügt, kann helfen Sie erkennen diese Deadlocks. In der Tat nutzen wir JMX innerhalb unserer eigenen Software, um automatisch Deadlocks zu erkennen eine Spur, wo es gefunden wurde.

Hier ist ein Beispiel darüber, wie es zu benutzen.

IntelliJ IDEA hat eine Menge nützlicher Gleichzeitigkeit Inspektionen . Zum Beispiel, es warnt Sie, wenn Sie das gleiche Objekt aus beiden synchronisierten und unsynchronisierten Kontexte zugreifen, wenn Sie auf Nicht-Zielobjekte synchronisieren und vieles mehr.

Ebenso FindBugs viele ähnliche prüft .

Neben @ Fernando Erwähnung Thread Deadlocks, ist ein weiteres Problem mit mehreren Threads gleichzeitig Änderungen und die Probleme, die sie verursachen können.

Eine Sache, die Java intern tut, ist, dass eine Sammlung Klasse eine Zählung, wie oft hält es aktualisiert. Und dann ein Iterator überprüft, die auf jeder .next Wert () gegen das, was es war, als der interator geschaffen wurde, um zu sehen, ob die Sammlung aktualisiert wurde, während Sie laufen wurden. Ich denke, das Prinzip allgemeiner verwendet werden könnte.

Versuchen Sie ConTest oder Covertity

Beide Werkzeuge analysieren den Code, um herauszufinden, welche Teile der Daten zwischen Threads gemeinsam genutzt werden könnten und dann Instrument sie den Code (fügen Sie zusätzliche Bytecode der kompilierten Klassen) zu überprüfen, ob es bricht, wenn zwei Threads versuchen, einige Daten zu ändern, bei die selbe Zeit. Die beiden Fäden werden dann überfahren und immer wieder, jedes Mal, sie mit einer etwas anderen Startzeit-Offset zu vielen möglichen Kombinationen von Zugriffsmustern zu erhalten.

Überprüfen Sie auch diese Frage: Einheit eine Multithread-Anwendung testen

Sie können in einem Ansatz interessieren Peter Veentjer über gebloggt, die er nennt Der Gleichzeitigkeitsdetektor . Ich glaube nicht, dass er diese noch Open-Source hat, sondern wie er es die Grundidee beschreibt, ist AOP zu verwenden, um Instrument Code, den Sie in Profilierung interessiert sind, und Aufzeichnung, die Gewinde, welches Feld berührt hat. Danach ist es eine Frage von manuell oder automatisch die generierten Protokolle Parsen.

Wenn Sie Thread unsichere Klassen identifizieren können, können statische Analyse der Lage sein, Ihnen zu sagen, ob sie jemals „Flucht“ auf mehrere Threads sichtbar werden. Normalerweise tun dies Programmierer in ihren Köpfen, aber offensichtlich sind sie auf Fehler in dieser Hinsicht anfällig. Ein Werkzeug sollte in der Lage sein, einen ähnlichen Ansatz zu verwenden.

Wie gesagt, die aus der Verwendung Fall, dass Sie beschreiben, klingt es wie etwas so einfach wie einen Faden zu erinnern und zu tun Behauptungen auf, es könnte für Ihre Bedürfnisse ausreichen.

class Foo {

  private final Thread owner = Thread.currentThread();

  void x() {
    assert Thread.currentThread() == owner;
    /* Implement method. */
  }

}

Der Besitzer Referenz noch einmal aufgefüllt wird, wenn Behauptungen deaktiviert sind, es ist so nicht ganz „frei“. Ich würde auch nicht wollen viele meiner Klassen mit dieser vorformulierten Krempel.

Die Thread.holdsLock (Object) Methode auch für Sie nützlich sein können.

Für das spezielle Beispiel, das Sie geben, hat SwingLabs einige Helfer Code Ereignis-Thread Verletzungen und hängt zu erkennen. https://swinghelper.dev.java.net/

Eine Weile zurück, ich mit den JProbe Java-Profiling-Tool gearbeitet. Einer ihrer Werkzeuge (threadalyzer?) Gesucht Thread sync Verletzungen. Mit Blick auf ihrer Web-Seite, sehe ich nicht ein Werkzeug, mit diesem Namen oder ganz das, was ich mich erinnere. Aber möchten Sie vielleicht einen Blick nehmen. http://www.quest.com/jprobe/performance-home.aspx

Sie können mit Netbeans Profiler oder JConsole die Fäden Status in der Tiefe überprüfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top