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