这些方法的设计意图是为了实现线程间的协作与同步,而这种协作是基于对象的监视器来进行的。在Java中,每个对象都关联着一个监视器,这个监视器是用来控制多个线程对共享资源的访问,确保线程间的互斥与协作。
为什么不放在Thread中?
锁的关联性:wait()是让获得对象锁的线程等待,会自动释放当前线程占用的对象锁并让其进入等待阻塞状态,要操作对应的对象,而不是线程。而sleep是让线程暂停执行,针对的是线程,不需要获得线程锁,所以sleep在Thread中。
对象作为同步单位:在Java中,同步通常是基于对象的,而不是基于线程。多个线程为了访问共享资源要争夺同一个对象的锁。将这些方法放在object类中,使得这些方法自然地与用于同步的对象关联在一起,更加符合面向对象的编程思想。
为什么放在Object类中?
通用性和灵活性:Java中的每个类都直接或间接继承object类,将这些方法放在object类中,意味着所有对象都可以调用它们,使得多线程通信的基本机制可以广泛用于各种类型的对象,提高了代码的通用性和灵活性。
与同步机制紧密结合:wait(),notify(),和notifyAll()是Java内置的线程同步机制的一部分,它们与synchronized关键字紧密关联。当一个线程进入一个对象的同步代码块或方法时,它会自动获取该对象的锁。这三个方法正是在拥有对象锁的前提下才能被调用,确保了线程间通信的安全性。因此,将它们放在Object类中,与锁的管理逻辑保持一致,逻辑上更为合理。
资源控制与协作:这些方法的主要目的是为了实现线程间的协作与资源控制。在多线程环境中,往往需要围绕共享资源进行操作,而这些资源通常就是对象。将这些方法放在 Object 类中,使得资源对象可以直接控制访问它的线程的行为,比如让线程等待某个条件满足(wait())、通知等待的线程条件已改变(notify() 或 notifyAll())。这与面向对象的思想相符,即行为(方法)与数据(对象状态)紧密绑定。