为什么等待,通知和notifyAll方法都在Object Class中?

我知道wait()方法总是用synchronized方法/块编写并对Object进行锁定但我想知道当所有方法都在Thread类中时出现了什么问题?

它们也在Thread类中。 但是这里的线程实例同样适合作为任何其他对象的同步对象。

此外,已经有人质疑太阳的这个决定,因为现在每个对象都承担着能够同步的负担,并且恕我直言,他们应该在很久以前重构这个对象。

如果我需要有一些东西可以同步,我经常这样做:

private Object syncObject = new Object(); 

然后我可以做我的

 synchronized(syncObject) 

在代码中的任何地方,并没有打扰任何其他意外同步的人。

在Thread对象上使用它们的问题是Thread使用此锁来实现它自己的目的。 这可能会导致混乱和奇怪的错误。

这些方法的上下文是与Java中的每个对象相关联的锁,因此我们无法将它们移动到Thread类。 例如,我们可能会做这样的事情。 线程1将一个项添加到列表中,并通知其他线程。 线程2等待列表更新并对其执行某些操作:

 thread 1 synchronized (lock) { list.add(item); lock.notifyAll(); } thred 2 synchronized (lock) { list.wait(); ... do something with list } 

如果将这些方法转移到一个线程,我们在这里做的事情是不可能的。

这些方法适用于锁,而锁与Object相关联,而不是与Threads相关联。 因此,它在Object类中。

方法wait(),notify()和notifyAll()不仅仅是方法,它们是同步实用程序,用于Java中线程之间的通信机制。

有关更多说明,请参阅: 为什么wait(),notify()和notifyAll()方法在Object类而不是Thread类?