2017-05-01 3 views
-1

私はjavaの同期概念について読んでいて、同期文を見つけました。Javaの同期文で引数を渡す必要があるのはなぜですか?

静的ブロック(これは単なる例です)のように見えますが、なぜ引数を渡すのですか?渡された引数には、指定されたデータ型がありません。

例:

public class MsLunch { 
    private long c1 = 0; 
    private long c2 = 0; 
    private Object lock1 = new Object(); 
    private Object lock2 = new Object(); 

    public void inc1() { 
     synchronized(lock1) { 
      c1++; 
     } 
    } 

    public void inc2() { 
     synchronized(lock2) { 
      c2++; 
     } 
    } 
} 

いずれかがそれについて知っている場合、説明してください。

+0

https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html – kosa

+2

ロックするオブジェクトを指定する必要があるためです。 –

+1

'lock1'と' lock2'が渡されているのですか?それらは同期しているオブジェクトです。 – Carcigenicate

答えて

-1

マルチスレッドアプリケーションでは、オブジェクトの状態を複数のスレッドが同期して読み書きする場合は、​​キーワードを使用します。

Javaが同期をサポートするために使用するメカニズムは、モニターです。各オブジェクトには、それに関連するモニターがあります。同期ブロックは、競合するスレッドが競合し、勝者スレッドがモニタを取得できるように、動作するオブジェクトが必要です。

java内の各非静的メソッドには、特定のメソッドが呼び出される暗黙的なthisオブジェクトがあります。メソッドシグネチャに​​キーワードを使用すると、暗黙的なthisオブジェクトに依存していることを意味します。他のオブジェクトに依存したい場合は、​​ブロックを使用し、ブロック内にオブジェクト参照を使用できます。

さまざまなブロックがあることを忘れないでください。同じオブジェクト上に​​ブロックのブロックは、互いに対して適切な同期化された実行を保証します。異なるオブジェクトの参照を持つ同期ブロックは、スレッドが同期して動作するよう強制しません。

したがって、objectXのいくつかの状態を変更し、ObjectAとのsynchronizedブロックで動作するthreadAがあるとします。別のスレッドBが同じオブジェクトXの状態を読み取っている可能性のある別のクラスに別のコードが存在する可能性があります。 threadBはobjectAとの同期ブロック内で読み込みを行い、objectXの状態が正しく読み込まれるようにする必要があります。

+0

downvoteの理由、私は自分自身を訂正することがうれしいです。 –

+0

それは私ではなかった...あなたの答えは本当に質問に答えることはありません。 OPは、同期化に関するチュートリアルを要求しなかった。本当の答えは非常に簡単です:1) 'lock1'と' lock2'はあなたがロックしているmutexです.2)これはメソッド呼び出しではないので引数ではありません。 –

+0

@ nits.kkそれは私ではありませんでしたが、誰かが私の質問を重複としてマークしました。彼はあなたの答えをdownvoteしているかもしれません。 –

関連する問題