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

时间:2012-03-01 12:14:42

标签: java multithreading

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

4 个答案:

答案 0 :(得分:4)

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

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

如果我需要同步某些内容,我经常这样做:

private Object syncObject = new Object();

然后我可以做我的

synchronized(syncObject) 

代码中无处不在,并且无需在this上意外同步其他任何人。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

thread 1
synchronized (lock) {
    list.add(item);
    lock.notifyAll();     
}

thred 2 
synchronized (lock) {
    list.wait();
    ... do something with list
}

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

答案 3 :(得分:0)

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

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

有关详细说明,请阅读:Why wait() ,notify() and notifyAll() methods are in Object class instead of Thread class?