为什么wait,notify和notifyAll方法在Object Class中?

问题描述:

我知道wait()方法总是写在同步方法/块中,并锁定对象,但我只想知道当所有方法都在Thread类中时出现了什么问题?为什么wait,notify和notifyAll方法在Object Class中?

+0

的可能重复[?为什么等待()和notify()在Java中的Object类中声明(http://stackoverflow.com/questions/1769489/why-are- wait-and-notify-declared-javas-object-class) – gnat 2013-01-09 11:08:37

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

另外,已经有人质疑sun的这个决定了,因为现在每个对象都承担着可以同步的负担,而恕我直言,他们早就应该将这个重构出来分离对象。

如果我需要的东西同步时,我经常这样做:

private Object syncObject = new Object(); 

然后,我可以做我

synchronized(syncObject) 
代码

无处不在,没有与任何人打扰在this上意外同步。

+1

这是多少负担? – 2012-03-01 12:18:46

+1

每个对象携带一个8字节的标题。如果我们不必能够在对象上同步,那么一个4字节的头部(类ref)可能就足够了。但是,我不知道额外头文件的某些字节是否仍然需要用于GC,但是此信息可能仍然会嵌入到4字节头文件中。 – Daniel 2012-03-01 12:21:40

在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中线程之间的通信机制。

详细说明如下:Why wait() ,notify() and notifyAll() methods are in Object class instead of Thread class?