sleep() は現在の同期メソッド/ブロックをロックすると聞きましたが、ここで、スレッド 1 で sleep() を呼び出すと、スレッド 2 は同じブロックにアクセスできますか? 誰でも説明できますか?
Main.java
public class Main {
public static void main(String args[])
{
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
System.out.println("going to start t1");
t1.start();
System.out.println("going to start t2");
t2.start();
}
}
================================================== ===================
Thread1.java
public class Thread1 extends Thread{
public void run() {
Syncc s1 = new Syncc();
s1.me("T1:");
}
}
================================================== ===================
Thread2.java
public class Thread2 extends Thread{
public void run() {
Syncc s2 = new Syncc();
s2.me("T2:");
}
}
================================================== ===================
同期.java
public class Syncc{
public void me(String s){
synchronized(this){
for(int i=0; i<=5; i++)
{
System.out.println(s+" "+" "+i);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
==========================================
出力:
going to start t1
going to start t2
T2: 0
T1: 0
T2: 1
T1: 1
T1: 2
T2: 2
T1: 3
T2: 3
T1: 4
T2: 4
T2: 5
T1: 5
しかし、sleep() メソッドによると、現在の同期ブロックのロックを解除するべきではありませんか? もしそうなら、出力は..
t1 を開始します t2 を開始します
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T2: 0
T2: 1
T2: 2
T2: 3
T2: 4
T2: 5
つまり、スレッド 1 の実行後、スレッド 2 のみが正しく開始されますか? 問題は何ですか?