2016-04-12 6 views
-1
public int synchronizedBlockGet() { 
    synchronized(this) { 
     return i; 
    } 
} 

私はいくつかの記事を読んでいる間にこのコードを見てきました。何が同期されていますか?クラス、またはメソッドまたはインターフェイス説明してください。このコードは何ですか。

+0

インスタンスを同期しているので、複数のスレッドが値を取得することはできません。 –

答えて

1

スレッドを処理しているときに、同期化または一般的な同期が行われます。たとえば、プログラムに2つのスレッドがあるとします。これらのスレッドの両方が同じオブジェクトを使用しています。 (1つのスレッドがArrayListに書き込んでおり、もう1つのスレッドがそれを読み込んでいるシナリオを考えてみましょう)。そのような場合、スレッドがリストに書き込んでいる間に、他のスレッドが読み取りまたは書き込みを行わないようにする必要があります。これは、リストへの書き込みは、少なくとも3からなるであろうからである

  • バックメモリに書き
  • オブジェクト(リスト)を変更するメモリ
  • から

    1. 読み出しステップ。

    これらのスレッドがインターセプトされず、矛盾しないようにするために、スレッド同期の概念を使用します。

    同期メソッドと同期ブロックを含む同期を達成するには、いくつかの方法があります。あなたが提供したコードは、同期ブロックです。

    public int synchronizedBlockGet() { 
        synchronized(this) { 
         return i; 
        } 
    } 
    

    ここで何が起こるかは一旦スレッドが、それはを上記の方法である(ロックオブジェクトの取得呼ばれる)、オブジェクト全体をロックするsynchronizedBlockGetメソッド内です。 synchronized(this)は、現在のスレッドがオブジェクト全体をロックすることを意味します。したがって、現在のスレッドがsynchronizedブロックを離れてオブジェクトを解放するまで、他のスレッドはこのオブジェクトにアクセスできません。あなたが与えた例は同期の必要な状況ではありませんが、後に起こることは同じです。

    +0

    私はそれを完全に取得しました。しかし、1つのクエリは、内蔵のメソッドやインターフェイス、クラスと同期されているということですか? –

    +0

    それはそれらのどれでもありません。それは、私が上で説明したことをするコンセプトや構文のようなものです。 –

    +0

    ありがとう、私たちがこの例とは別に同期して使うことができる他の場合は何ですか? –

    0

    これはキーワードであり、一度に1つのスレッドしかブロックに入力できません。

    これは、このオブジェクトのロックを取得することでこれを実現します。

    関連する問題