可能是我的标题不正确。
我已经通过编程开始了Java多线程概念。由于我已在同步块内部读取,因此只有一个线程会插入特定的对象锁。但是我看了这个程序的输出后感到困惑。 包com.example.classandobjectlevellock;
Class MyThread实现Runnable { 对象ob = new Object();
public void run() {
synchronized (this) {
System.out.println(Thread.currentThread().getName()+" Is waitng");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
公共类ClassAndObjectLevelLock {
public static void main(String[] args) throws InterruptedException {
MyThread task1 = new MyThread();
MyThread task2 = new MyThread();
Thread t1 = new Thread(task1,"Thread1");
Thread t2 = new Thread(task1,"Thread2");
Thread t3 = new Thread(task2,"Thread3");
t1.start();
Thread.sleep(1000);
t2.start();
Thread.sleep(1000);
t3.start();
}
} 输出: 线程1是waitng 线程2是waitng Thread3是waitng
如果我没记错的话,线程1和线程3正在进入同步方法,因为它具有两个不同的目标对象。但是,为什么Thread-2进入了同步块?
请帮助我理解这一点。 预先感谢。
答案 0 :(得分:2)
调用wait()
导致锁被释放。
使当前线程等待,直到另一个线程调用
notify()
方法或此对象的notifyAll()
方法。在 换句话说,此方法的行为就像它只是执行 致电wait(0)
。当前线程必须拥有此对象的监视器。 线程 释放此监视器的所有权,并等待直到另一个线程 通知在此对象的监视器上等待的线程唤醒 通过调用
notify
方法或notifyAll
方法。的 然后线程等待,直到它可以重新获得监视器的所有权并 恢复执行。