Gibt es eine Möglichkeit oder ein Tool, mit denen ich überprüfen kann, ob meine API in Java threadsicher ist?

8

Ich mache ein Tool und stelle eine API für die externe Welt bereit, aber ich bin mir nicht sicher, ob es threadsicher ist. Weil Benutzer sie möglicherweise in einer Umgebung mit mehreren Threads verwenden möchten. Gibt es eine Möglichkeit oder ein Tool, mit denen ich überprüfen kann, ob meine API in Java threadsicher ist?

    
zjffdu 05.10.2010, 12:47
quelle

6 Antworten

6

Stresstests oder statische Analysetools wie PMD und FindBugs kann einige Nebenläufigkeitsfehler in Ihrem Code aufdecken. Diese können also zeigen, ob Ihr Code nicht threadsicher ist. Sie können jedoch niemals beweisen, dass es threadsicher ist.

Die effektivste Methode ist eine gründliche Code-Überprüfung durch Entwickler, die Erfahrung mit Nebenläufigkeit haben .

    
Péter Török 05.10.2010, 12:53
quelle
17

Nein . Es gibt kein solches Werkzeug. Es ist sehr schwierig, zu beweisen, dass ein komplexes Programm Thread-sicher ist.

Sie müssen Ihr Programm sehr sorgfältig analysieren, um sicherzustellen, dass es Thread-sicher ist. Erwägen Sie den Kauf von "Java Concurrency in der Praxis" (sehr gute Erklärung der Parallelität in Java).

    
Arne 05.10.2010 12:50
quelle
1

Sie können es immer mit Tools wie jmeter testen.

Aber das Hauptproblem mit Threads ist, dass sie meist unvorhersehbar sind, also selbst bei Stresstests usw. kann man nicht 100% ig sicher sein, dass es absolut threadsicher ist . p>

Ressourcen:

Colin Hebert 05.10.2010 12:48
quelle
1

Dies ist eine Variante (oder "Reduktion") des Halteproblems. Daher ist es nachweislich unlösbar. für alle nicht-trivialen Fälle. (Ja, das ist eine Bearbeitung)

Das heißt, Sie können Fehler mit allen üblichen Mitteln (Statistiken, Logik) finden, aber Sie können nie vollständig beweisen, dass es keine gibt.

    
Kajetan Abt 05.10.2010 13:09
quelle
1

Ich nehme an, diese Leute sagen, dass die Beweisführung eines beliebigen Multithread-Programms thread-safe unmöglich ist, sind in gewisser Weise richtig. Ein beliebiges Multithread-Programm, das ohne Einhaltung strenger Richtlinien codiert wird, wird Threading-Fehler haben, und Sie können nicht gültig etwas beweisen, das nicht wahr ist.

Der Trick besteht nicht darin, ein beliebiges Programm zu schreiben, sondern mit einer Threading-Logik, die einfach genug ist, um möglicherweise korrekt zu sein. Dies kann dann durch ein Tool eindeutig validiert werden.

Das beste Tool, das mir bekannt ist, ist CheckThread . Es funktioniert auf der Grundlage von Annotationen oder XML-Konfigurationsdateien. Wenn Sie eine Methode als @ThreadSafe markieren und dies nicht der Fall ist, erhalten Sie einen Kompilierungsfehler. Dies wird überprüft, indem der Byte-Code für Thread-unsichere Operationen betrachtet wird, z. liest / schreibt Sequenzen in unsynchronisierten Datenfeldern.

Es verarbeitet auch jene APIs, die erfordern, dass Methoden an bestimmten Threads aufgerufen werden, z. Schaukel.

Deadlocks werden nicht tatsächlich gehandhabt, aber diese können statisch eliminiert werden, ohne dass eine Annotation erforderlich ist, indem ein Tool wie verwendet wird Jlint . Sie müssen nur ein paar minimale Standards befolgen, wie zum Beispiel das Sicherstellen, dass Schlösser nach einer DAG erworben werden, nicht unbedingt billig.

    
soru 05.10.2010 18:33
quelle
0

Sie können und werden nicht in der Lage sein, automatisch zu beweisen, dass ein Programm threadsicher ist, so dass Sie beweisen können, dass ein Programm korrekt ist (es sei denn, Sie denken, dass Sie das Unterbrechungsprogramm gelöst haben).

Nein, Sie können nicht überprüfen, ob eine API threadsafe ist.

Allerdings können Sie in einigen Fällen beweisen, dass es kaputt ist, was großartig ist!

Sie könnten auch an einer automatischen Deadlock-Erkennung interessiert sein, die in manchen Fällen einfach "einfach funktioniert". Ich habe ein Java-Programm auf hunderten von Desktops mit einem solchen Deadlock-Detektor ausgeliefert und es ist ein wunderbares Werkzeug. Zum Beispiel:

Ссылка

Sie können Ihre Anwendung auch auf verschiedene Arten testen.

Bogus Multithread-Programme neigen dazu, nicht sehr gut zu funktionieren, wenn eine hohe Last auf dem System vorhanden ist.

Hier ist eine Frage, die ich gestellt habe, wie man leicht eine hohe CPU-Last auf einem Un * x-System erzeugt, zum Beispiel:

Bash: Einfacher Weg, eine konfigurierbare Last auf ein System zu setzen?

    
SyntaxT3rr0r 05.10.2010 13:01
quelle