2017-10-14 7 views
0
Pactice

なぜJavaオブジェクトはロックおよび条件キューのように動作できますか?

でのJava並行処理から

すべてのJavaオブジェクトは、暗黙のうちに、同期の目的のためにロックとして機能することができます。これらのビルトインロックは、イントリンシックロックまたは モニタロックと呼ばれます。

「すべてのJavaオブジェクトが暗黙的にロックとして機能する」とはどういう意味ですか?

すべてのJavaオブジェクトのクラスは、次のようにLockインターフェイスを実装していますか?それはすべてのJavaオブジェクトのクラスはダックタイピングの感覚では、ロックのようなオブジェクトを作用させるいくつかの方法を提供することが

public interface Lock {  
    void lock(); 
    void lockInterruptibly() throws InterruptedException; 
    boolean tryLock(); 
    boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException; 
    void unlock(); 
    Condition newCondition();  
} 

を意味するのでしょうか?各Javaオブジェクトをロックとして機能できるのと同じよう

各オブジェクトは、条件キュー、ウェイト、通知、およびオブジェクト内のnotifyAll 方法として 行為は、本来の状態キューのAPIを構成することができます。

「各オブジェクトは条件キューとしても機能します」とはどういう意味ですか?

それは各Javaオブジェクトのクラス

  • は、いくつかの「条件キュー」インターフェース、または
  • ダックタイピングの意味での条件キューなどのオブジェクトを作用させるいくつかの方法を提供を実装することを意味しています?

ありがとうございます。

+2

"すべてのJavaオブジェクトのクラスがLockインターフェイスを次のように実装していますか?いいえ、 'synchronized(expression){...}'の式としてオブジェクトを使用できることを意味します。 –

+0

ありがとうございます。どのようなタイプのオブジェクトは、 'synchronized'がかっこ内に期待していますか? – Ben

+2

[任意の参照タイプ](https://docs.oracle.com/javase/specs/jls/se9/html/jls-14.html#jls-14.19)。それがポイントです。 –

答えて

1

いいえ、それはすべてのクラスが実際にLockインターフェイスを(実装していることを意味するものではありません、そのインターフェイスは、すべてのオブジェクトがあるため、実質的に回避されている暗黙のモニターを持っているという考えを導入した後、十年以上を作成しましたJavaの導入)。

それだけで次のようにすべてのオブジェクトは、それが簡単なミューテックスとして使用することができます暗黙のモニターを持っていることを意味します

synchronized (someObject) { 
    // this region is protected from concurrent execution by other threads 
    // locking on the same object 
} 

それは、このようなwait()など、より洗練されたモニターユースケースでも使用することができ、 notify()これは、条件変数の一種(おそらくの条件変数の別の名前ですか?)として機能することを可能にするものです。この決定の

利点と欠点が多少熱く議論されている:それはあなたが別のミューテックスを必要とするか、変数のオブジェクトを調整していない意味していながら任意のオブジェクトはこのように使用することができますので、実装上の負担を課しますおそらくオブジェクトのほんの一部が消えているのですが。このコストを削減するために使用される多くの実装方法があります。

Java 5以降、さまざまなLockの実装を含む、JDKによって提供される多くの明示的な同期プリミティブがあります。

関連する問題