Javaでのロックのための新しいオブジェクト対新しいクラス

Vitalii:

クラスからオブジェクトから作成されたロックの間に違いはありますか?

class AWTInvocationLock {}
Object lock = new AWTInvocationLock();

public void foo(){
    synchronized (lock) {
        // ...
    }
}

public Object lock = new Object();
public void bar(){
    synchronized (lock) {
        // ...
    }
}

java.awt、私はこのコードを見て、私はの考えに疑問を抱いてるclass AWTInvocationLock {}だけではなく、new Object()

static void invokeAndWait(Object source, Runnable runnable)
    throws InterruptedException, InvocationTargetException
{
    // ...

    class AWTInvocationLock {}
    Object lock = new AWTInvocationLock();

    InvocationEvent event =
        new InvocationEvent(source, runnable, lock, true);

    synchronized (lock) {
        Toolkit.getEventQueue().postEvent(event);
        while (!event.isDispatched()) {
            lock.wait();
        }
    }

    //...
}
保存:

これは、コードを少し記述する方が良いでしょう。

class AWTInvocationLock {}
    Object lock = new AWTInvocationLock();

    InvocationEvent event =
        new InvocationEvent(source, runnable, lock, true);

    synchronized (lock) {
        Toolkit.getEventQueue().postEvent(event);
        while (!event.isDispatched()) {
            lock.wait();
        }
    }

ロックオブジェクトの参照は、ローカルスコープを脱出されます。REFはに格納されInvocationEventたオブジェクト。

InvocationEvent event =
            new InvocationEvent(source, runnable, lock, true);

EventQueueディスパッチスレッドがポストされたイベントオブジェクトを待機しています。スレッドが起動するdispatch()各イベントのメソッドを。私は、ソースコードを見ていないが、私は推測しているInvocationEvent.dispatch()。このような方法で疑似コードルックス。

 1. synchronize(lock)
 2. runnable.run() -- store any exceptions to a "throwable" reference variable
 3. lock.notify()

だから、EventQueueディスパッチスレッドの呼び出しnotify()スレッドを解放するロック・オブジェクト、上の呼び出しinvokeAndWait()からwait()次の行でコール。

クラスからオブジェクトから作成されたロックの間に違いはありますか?

AWTInvocationLockメソッドのスコープを持つという名前の内部クラスです。私は実際に野生のものを見たことがありません。そのA 本当にあいまいな言語の一部、と私は知っているほとんど誰が知っている1。Javadocのもこれらを認識しないと、それらのドキュメントを生成しないので、私はそのせいのいずれかを使用しない、そしてだろう!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=190665&siteId=1