【发布时间】:2012-03-19 22:30:02
【问题描述】:
我知道 wait() 方法总是写在同步方法/块中并对 Object 进行锁定,但我只想知道当所有方法都在 Thread 类中时会出现什么问题?
【问题讨论】:
标签: java multithreading
我知道 wait() 方法总是写在同步方法/块中并对 Object 进行锁定,但我只想知道当所有方法都在 Thread 类中时会出现什么问题?
【问题讨论】:
标签: java multithreading
它们也在 Thread 类中。但是这里的线程实例与任何其他对象一样适合作为同步对象。
此外,已经有声音质疑 sun 的这一决定,因为现在每个对象都承担着能够同步的负担,恕我直言,他们早就应该将其重构为分离对象。
如果我需要同步一些东西,我经常这样做:
private Object syncObject = new Object();
那我可以做我的了
synchronized(syncObject)
代码中的任何地方,不必担心其他人意外在this 上同步。
【讨论】:
在 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 类中。
wait()、notify() 和 notifyAll() 方法不仅仅是方法,它们是同步实用程序,用于 Java 中线程之间的通信机制。
更多解释请阅读:Why wait() ,notify() and notifyAll() methods are in Object class instead of Thread class?
【讨论】: