synchronized内必须要用对象锁吗?
来源:7-2 wait方法

96年的nash
2019-10-12
//对象锁
private static Object object = new Object();
private static Object object2 = new Object();
//实例对象
static class Thread1 extends Thread{
@Override
public void run() {
synchronized (object){
System.out.println(Thread.currentThread().getName() + "开始执行了");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//执行到这一行,表示线程此时又重新拿到了锁
System.out.println("线程"+Thread.currentThread().getName() + "获取到了锁");
}
}
}
static class Thread2 extends Thread{
@Override
public void run() {
synchronized (object){
//唤醒thread1
object.notify();
//此时,依然会执行以下代码,而不是执行thread0,因为此时thread1依然拥有这把锁
System.out.println("线程"+Thread.currentThread().getName() + "调用了notify");
}
}
}
我看老师的代码内都是选用的对象锁,是因为一个类中的不同实例拥有不同的对象锁,而只能有一把类锁吗?而object.wait()和object.notify(),就是对象锁执行了wait和notify方法,notify只能随机唤醒等待同一把对象锁的线程,是这个意思吗老师?
写回答
1回答
-
用对象锁可以自由控制锁住的对象。
object.wait()和object.notify(),就是对象锁执行了wait和notify方法,notify只能随机唤醒等待同一把对象锁的线程
对的,只能唤醒相对应的锁。
synchronized内必须要用对象锁
这个不是必须的
012019-10-12
相似问题