2つのスレッドがあり、これらのスレッドでStudentオブジェクトの異なるメソッドを実行します。問題は、このコードを実行するとt2スレッドが同期ブロックを完了するのを待つことです。異なる方法で異なるオブジェクトをロックする方法はありますか?
なぜt1が完了するのを待っていますか?どのようにしてお互いにブロックすることなく、異なる方法で異なるオブジェクトをロックすることができますか?
これは主な方法です。
Student student = new Student();
Thread t1 = new Thread(() -> {
try {
student.addA();
} catch (InterruptedException ex) {
Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
}
});
Thread t2 = new Thread(() -> {
try {
student.addB();
} catch (InterruptedException ex) {
Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
}
});
t1.start();
t2.start();
ここは学生クラスです。
public class Student {
private Integer a = 0;
private Integer b = 0;
public void addA() throws InterruptedException{
System.out.println("addA start");
synchronized(a){
System.out.println("addA sync start");
a++;
Thread.sleep(5000);
}
System.out.println("addA end");
}
public void addB() throws InterruptedException{
System.out.println("addB start");
synchronized(b){
System.out.println("addB sync start");
b++;
Thread.sleep(5000);
}
System.out.println("addB end");
}
}