为什么wait,notify和notifyAll方法在Object Class中?
我知道wait()方法总是写在同步方法/块中,并锁定对象,但我只想知道当所有方法都在Thread类中时出现了什么问题?为什么wait,notify和notifyAll方法在Object Class中?
它们也在Thread类中。但是这里的一个线程实例同样适合作为任何其他对象的同步对象。
另外,已经有人质疑sun的这个决定了,因为现在每个对象都承担着可以同步的负担,而恕我直言,他们早就应该将这个重构出来分离对象。
如果我需要的东西同步时,我经常这样做:
private Object syncObject = new Object();
然后,我可以做我
synchronized(syncObject)
代码
无处不在,没有与任何人打扰在this
上意外同步。
这是多少负担? – 2012-03-01 12:18:46
每个对象携带一个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?
的可能重复[?为什么等待()和notify()在Java中的Object类中声明(http://stackoverflow.com/questions/1769489/why-are- wait-and-notify-declared-javas-object-class) – gnat 2013-01-09 11:08:37