2016-06-11 10 views
-6

私は同じクラスの2つのスレッドt1とt2を持っています。 t1はクラス自体で同期し、t2はthis(インスタンス)で同期します。t1が同期ブロックに入ったと仮定すると、t1がまだその同期ブロックに入っている間にt2を入力できますか?Java同期クラスとこれは2つのスレッドで

編集: 例:

public class MyThread extends Thread{ 
private int id; 
public MyThread(int i){id=I;} 
public void run(){ 
    if(id==1)//t1 will lock the clas 
     synchronize(MyThread.class){ 
      … 
     } 
    else if(id==2) //t2 will lock the instance 
     synchronize(this){ 
      … 
     } 
} 

}

+1

コードを投稿してください。可能であれば、簡単なテストケースに減らしてください。また、それを実行してみる前に何が起こるかを調べてみてください。開発者にとって最も重要なスキルは、コードがどのように動作するかを調べるために実験する能力です。 –

+0

答えは「はい」だと思います。しかし、私は疑問を誤解していた可能性があります。実際の答えはNo. –

+0

です。@ジムガリソン私は例コード – Erez

答えて

1

  • 1idで作成されたすべてのMyThreadのインスタンスがMyThreadクラスのオブジェクトで同期します。これは、2つのインスタンスが最初のsynchonizedブロック内に同時に存在できないことを意味します。 2idで作成

  • すべてMyThreadインスタンスがthisに同期します。今すぐthisはスレッドオブジェクトそのものです。すべてのスレッドは異なるMyThreadを持っているので、効果的にロックされません。

  • id値を持つインスタンスの実行方法は、1id2、又はその逆でインスタンスをブロックしないであろう。彼らは異なるロックを使用しています。


1 - 1つのスレッドが別のスレッドのMyThreadオブジェクトにアクセスすることができれば理論的には、それが明示的にそのオブジェクトにrun()メソッドを呼び出すことができます。結局のところ、方法はpublicです。その場合、thisは現在のスレッドではないため、潜在的にロックされています。しかし、これは正気なプログラマーがやることではありません。

2

最初のスレッドが同期ブロックにまだある間にあり、第二のスレッドが同期ブロックを入力することができます。これは、2つのスレッドが異なるもので同期しているためです。つまり、クラスの最初のスレッド、そのクラスのインスタンスの2番目のスレッドです。あなたの例では