私は探検しようとしているstatic synchronized method
私はそれがインスタンスではなく、クラスのロックを取得する理論的な概念を得た。しかし、私はそれを試すことができる例を作ることに失敗しました。Javaで実際に静的同期メソッドがどのように機能しますか?
ここで私はテストするコードを作成しましたが、両方のインスタンスが同時にstatic synchronized method
にアクセスしています。
class Demo{
public static synchronized void a(){
System.out.println("A Method " + Thread.currentThread().getName());
}
}
public class StaticSyn{
public static void main(String[] args){
Demo obj = new Demo();
Demo obj2 = new Demo();
Thread one = new Thread(){
@Override
public void run(){
int i=0;
while(i<5){
obj.a();
try{
Thread.sleep(100);
}catch(InterruptedException e){
}
i++;
}
}
};
Thread two = new Thread(new Runnable(){
@Override
public void run(){
int i=0;
while(i<5){
obj2.a();
try{
Thread.sleep(100);
}catch(InterruptedException e){ }
i++;
}
}
});
one.start();
two.start();
}
}
static synchronized
この出力が表示されます。
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
A Method Thread-1
A Method Thread-0
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
いいえstatic
キーワードこの出力を得ています。
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
A Method Thread-0
A Method Thread-1
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
だからどこに問題がありますか?どのようにして1つのオブジェクトが静的同期メソッドにアクセスしているかをテストできます。あなたは確かに、あなたは、あなたが次の出力に似同時に、このブロックを実行する2つのスレッドを持っていないことがわかります
public static synchronized void a(){
System.out.println("Before sleep: A Method " + Thread.currentThread().getName());
try{
Thread.sleep(100);
} catch(InterruptedException e){
Thread.currentThread().interrupt();
}
System.out.println("After sleep: A Method " + Thread.currentThread().getName());
}
:
Demo'は '同期(Demo.class){...}'方法の本体をラップに相当する ''に静的synchronized'方法:これはそれを行う1つの方法です。 –
@AndyTurnerはい私は知っていますが、なぜ両方のスレッドが別のオブジェクトで同じメソッドにアクセスしているのですか? –
問題はありません。どちらのスレッドも* a *()内にありません。 – zapl