java匿名クラスと同期および“ this”
-
03-07-2019 - |
質問
JAVA GUIで競合状態に対処していると思います。
「匿名メソッド」を作成するメソッドがいくつかあります。このような匿名クラス内:
synchronized foo()
{
someMethod(new TimerTask()
{
public synchronized run()
{
//stuff
}
};
}
質問:実行メソッドは、TimerTaskオブジェクトまたはfooが含まれるクラスで同期されていますか?
質問2:「同期」を削除した場合run()宣言で、代わりにrun()本体内にsynchronized(this){}ブロックを含めると、「this」がTimerTaskオブジェクトまたはfoo()を含むメソッドのインスタンスであるオブジェクトを参照しますか?
こちらで手伝ってください。
ありがとう、 jbu
解決
run
メソッドは、 TimerTask
自体で同期されます。同期されたインスタンスメソッドは常に this
オブジェクトで同期されます。 (クラスメソッドは Class
オブジェクトで同期されます。)
foo
がメンバーになっているオブジェクトで同期する場合は、 this
キーワードを修飾します。 foo()
が< TimerTask
の run()
メソッド内のcode> Bar クラスでは、
public void run() {
synchronized(Bar.this) {
...
}
}
他のヒント
これらの答えは確かにわかりますが、良いソースATMを掘り下げることはできません。
最初の質問:
synchronizedは、TimerTaskをロックします。
2番目の質問:
これはTimerTaskを指します。含むオブジェクトをロックする場合は、MyContainingObject.thisを使用します
swing要素にアクセスできるスレッドは1つだけです。それはAWT-EventQueue-0です。これに注意する必要があります。他のスレッドが要素をdれさせたり変更したりしている場合、GUIがクラッシュする可能性が非常に高くなります。 このスレッドでGUIを実行するには:
try { SwingUtilities.invokeAndWait(new Runnable(){ public void run(){ Swing_Prozor1 prozor = new Swing_Prozor1(); } }); } catch (InterruptedException e) { //namjerno zanemareno } catch (InvocationTargetException e) { //namjerno zanemareno }
そして匿名クラスがある場合、これはあなたがいるクラスのインスタンスを与えるので、匿名クラスでこれを書いている場合、これ。そのクラスのインスタンスです。書きたいクラスのインスタンスを取得するには:
ClassName.this
うーん、あなたが書いた上記のコードはこれを教えてくれます。コードの一部を2回予測しました。 syncronizedメソッドを記述すると、一度に1つのスレッドのみがこのメソッドにアクセスできます。他のスレッドは、同期メソッドがロック解除されるまで待機します。
foo()とrun()の同期を探している場合は、次のような明示的なロックオブジェクトを作成できます
最終オブジェクトロック= new Object();
その後、同期します。
foo() {
synchronized(lock) {
someMethod(new TimerTask() {
public void run() {
synchronized(lock) {
//stuff
}
}
}