java的Object.wait和notify为啥要求当前线程在调用这两个方法时必须先获得该对象的锁?

赞同@张三 的观点。
首先,在一个时间内,同一个对象只能被一个线程获取到。如果没有强制要求在synchronized中执行,线程A在调用notify方法的时候,它可能没有得到对象锁,而notify可以引起其他处于wait状态的线程变为唤醒的状态,这样一搞下来就乱了。而如果线程A有活动对象锁,在它用完对象后,调用notify操作,然后释放对象锁,其他线程就可以来竞争这个对象锁了。
再来一个简单的比方(求轻喷!):
比如某个地方只有一个厕所,一次上厕所只能一个人。然后只有获得厕所使用权的人才有资格做两种事情。第一,他可以选择自己上完厕所,然后用notify方法提醒别人,你们可以来上厕所了,然后他自己释放厕所的所有权。第二,他可能先让给别人先上厕所(中华民族有尊老爱幼的传统美德哈哈哈),然后他就是调用wait()方法,告诉别人说你们可以来上厕所了,我先去队伍中等等,然后他释放了厕所的所有权。
那假如任何人都可以调用wait方法和notify方法,不管他有没有厕所的所有权。那么就可能会导致这样一种情况,一个没有厕所的人在瞎忽悠别人,大喊着厕所有空位了,而当一大群人一哄而上要去抢位置时,发现厕所早就有人占用着,那不就乱了?

最后,推荐一下这方面写得不错的博客:
JVM源码分析之Object.wait/notify实现

■网友
【java的Object.wait和notify为啥要求当前线程在调用这两个方法时必须先获得该对象的锁?】 wait的功能是释放锁且将当前线程的放入等待队列Q,使当前线程进入等待状态,这个过程相当于写队列,依据消费者生产者原理,我们应该上锁,等待插入完成后释放。而notify是通知线程进入就绪状态,即将Q中的线程取出来,也需要加锁,原因则跟wait的解释一样。

■网友
假如java允许不加锁,有可能notify先执行,本来去通知别的线程去做事了,结果别的立即又等待了
■网友
语义上的要求吧……notify是当前代码块完成之后notify,没有获得锁,那么就没有当前了,也无权释放了。至于wait,若不在对应代码块中,我wait后获取该锁又有什么用呢?
■网友
因为这个称为monitor的对象锁在同一时刻只有一个对象能获取该锁。Only one thread at a time can own an object\u0026#39;s monitor.Object (Java Platform SE 7 )wait方法可以理解为交出该对象锁,notify方法可以理解为把该对象锁交给之前通过wait方法交出该对象锁的线程,那么无论哪个方法,要交出对象锁显然都要先获取该对象锁,因为它是唯一的。


    推荐阅读