Iam new для синхронизации и многопоточности, пожалуйста, ответьте, почему этот код не получает блокировку объекта b.Почему не синхронизированный метод вызывается при покупке блокировки объекта?
public class Tetsclass {
public static void main(String[] args) {
B b = new B();
A a = new A(b);
A2 a2 = new A2(b);
Thread t1= new Thread(a);
Thread t2= new Thread(a2);
t1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
}
class B {
public synchronized void waitfor() {
synchronized (B.class) {
System.out.println("Lock aquired on "+System.currentTimeMillis());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Lock released");
}
}
public void readObject() {
System.out.println("readobject by thread==="+Thread.currentThread().getName()+" on "+System.currentTimeMillis());
}
}
class A2 implements Runnable {
B b=null;
public A2(B b) {
this.b = b;
}
@Override
public void run() {
b.readObject();
}
}
class A implements Runnable {
B b=null;
public A(B b) {
this.b = b;
}
@Override
public void run() {
b.waitfor();
}
}
Я ожидал, что выход:
Lock aquired on 1380016080337
Lock released
readobject by thread===Thread-1 on 1380016082337
но вывод:
Lock aquired on 1380016080337
readobject by thread===Thread-1 on 1380016082337
Lock released
да, но при вызове синхронного метода он получит блокировку для всего объекта. Итак, почему этот readObject вызывается? – Achyut
Вы уверены, что прочитали мой ответ в полном объеме? В моем втором и третьем абзацах подробно рассмотрен ваш вопрос. –