SunToolkit.awtLock: Muss Code, der eine solche Sperre benötigt, auf dem EDT aufgerufen werden?

8

Ich habe einen Deadlock untersucht und Folgendes im Thread Dump gesehen:

%Vor%

Dies wird verursacht, indem Robot robot = new Robot();

aufgerufen wird

Dieser Aufruf nimmt eine Sperre ( SunToolkit.awtLock ) und ich fragte mich, wer diese Sperre sonst noch benutzt, und ob es besser wäre, wenn ich diesen new Robot() -Aufruf an die EDT verschieben würde. Der Name deutet darauf hin, dass es von AWT verwendet wird, das single-threaded ist. Wenn auch etwas im EDT diese Sperre übernimmt (z. B. eine Swing-Komponente), erhöhen sich meine Chancen auf einen Deadlock, wenn ich Robot vom EDT erzeuge.

Auf der anderen Seite, wie in diese Frage besprochen, sind viele der Methoden Robot entworfen, um zu werfen eine Ausnahme, wenn der EDT aufgerufen wird. Dies würde es ärgerlich machen, wenn es am besten wäre, die Robot Instanz auf dem EDT zu erstellen.

Dasselbe Problem existiert für Toolkit.getDefaultToolkit().getScreenResolution() , also muss man sich nicht nur auf die Klasse Robot konzentrieren:

%Vor%

Also was ich versuche zu klären:

  • Wer sind die Beteiligten in diesem Schloss?
  • War diese Sperre vielleicht nur in dem Versuch eingeführt worden, Swing / AWT multi-threaded zu machen (oder zumindest etwas thread-sicherer), aber wäre die empfohlene Vorgehensweise, diese Sperre nicht auf einem anderen Thread als der EDT zu verwenden?
  • Gibt es offizielle Oracle / Sun-Dokumentationen (so etwas wie den Concurrency in Swing-Leitfaden), die ich konsultieren kann? Meine Google-Fähigkeiten haben mich daran gescheitert.
Robin 16.04.2013, 11:32
quelle

1 Antwort

1

Siehe den Quellcode für SunToolkit.java hier: Ссылка Der Zweck von AWT_LOCK wird in Zeile 208 erklärt.

Hier ist der Auszug für den Fall, dass die Seite verschwindet:

%Vor%
    
lyaffe 07.05.2013 09:26
quelle

Tags und Links