2011-08-01 3 views
2

同期化されたキーワードがJava 6でどのように機能するかを明確にする必要があります。Java synchronizedキーワード - クラスメソッドが同時に実行されるのを防ぎますか?

次のクラスの例を使用します。

class Carrier { 

    private String[] _collection = new String[2]; 

    public Carrier() { 
     this._collection[0] = "abc"; 
     this._collection[1] = "123"; 
    } 

    public syncronized void change(int cId) { 
     Thread.sleep(3000); 
     this._collection[cId] = "changed"; 
    } 

} 

次に、アプリケーション内のいくつかの場所は、キャリアクラスの同じオブジェクトインスタンスを参照し、.change()メソッドは、おそらく同時に、呼び出されます。

...carrier.change(1); 

...

...carrier.change(1); 

syncronizedキーワードは、メソッドのasyncronized実行を防止しますか?単に呼び出しを.change()にキューイングし、それぞれが完了するのを待つでしょうか?

+0

'呼び出しをキューに入れるだけですか?change() 'キューの意味に依存します。実行順序は指定されていないため、順序付けされたキューではありませんが、他のスレッドは強制的に待機します。 – Kaj

答えて

2

はい、2つのメソッド呼び出しが同時に実行されないようにします。

これは実際に​​キーワードの主な用途です。

1つの同期メソッドが実行されると、呼び出されたオブジェクトに対して「ロック」が取得されます。つまり、そのメソッドがロックを保持している間は、他の同期コードをそのオブジェクトで実行することはできません。メソッドの実行が終了すると、ロックが解放され、他の同期メソッドはそのオブジェクトのロックを取得できます。

1

はい、はいです。 (​​ではなく、syncronized

4

はい、最初のスレッドの実行中に2番目のスレッドがブロックされます。これは、両方とも同じオブジェクト上のモニタを取得しようとしているからです(この場合は、this経由)。だからあなたのchange方法は同等です:個人的に私が上で同期好きではない

public void change(int cId) { 
    synchronized (this) { 
     Thread.sleep(3000); 
     this._collection[cId] = "changed"; 
    } 
} 

「これ」それは同じモニターを獲得することができ、オブジェクト自体へのアクセス権を持つ任意のコードを意味します。ので、まだ同じオブジェクト上changeを呼び出す2つのスレッドの面で同じ効果を持つことになります

private final Object lock = new Object(); 

public void change(int cId) { 
    synchronized (lock) { 
     Thread.sleep(3000); 
     this._collection[cId] = "changed"; 
    } 
} 

:私はちょうどクラス内のみコードがアクセス権を持っているロックのためのオブジェクトを作成することを好みます両方のスレッドは引き続き同じモニター(ロック固有のオブジェクトに関連付けられているもの)だけを取得します。

+0

別個のロックオブジェクト上の良い点。 – dropson

1

はい - synchronizedキーワードは、異なるスレッドによるメソッドの同時実行を防ぎます。

注:「クラスメソッド」はstaticメソッドです。 "インスタンスメソッド"(つまり非静的)はあなたの質問にあります。

+0

素晴らしい。私はそれを私の語彙に加えます。 「存在」(beeingではない)と一緒に;-) – dropson

1

​​は、現在のプログラミングでのアクセスを同時に防止するために使用されます。 たとえば、クライアントがある場合は、読み取り対象のクライアントと書き込み対象のクライアントがあります。

ロックhereを網羅しています。

関連する問題