目前,我正在学习Java并发编程。我注意到Java 1.6中引入的LockSupport.park()Object.wait()易于使用,Object.wait()的典型用法是

// Thread1
synchronized (lock) {
    while (condition != true) {
        lock.wait()
    }

    // do stuff
}

// Thread2
synchronized (lock) {
    condition = true;
    lock.notify();
}

我想我可以使用LockSupport.park()重写它,例如
// Thread1
while (condition != true) {
    LockSupport.park();
}

// do stuff

// Thread2
condition = true;
LockSupport.unpark(Thread1);

通过使用LockSupport.park(),乏味的synchroinzed块消失了。

我的问题是,我应该始终喜欢LockSupport.park()而不是Object.wait()吗?在性能方面,Object.wait()在任何方面都比LockSupport.park()更好吗?

最佳答案

wait/notify背后的想法是,通知不是特定于线程的,通知者不必知道需要通知的特定线程,它只是告知正在通知的锁(或ReentrantLock的条件),并且锁和它们之间的操作系统调度程序决定谁接收通知。

我希望通知者在大多数时候都不想知道什么线程需要中断,因此等待/通知对于这些情况是一个更好的选择。使用停放/取消停放,您的代码必须了解更多,并且会有更多的失败机会。您可能认为同步块(synchronized block)是乏味的,但是真正要繁琐的工作是找出一些情况,即某些情况下本应保留的东西并没有解散。

请注意,在您的第二个示例中,您的条件需要是 volatile 或原子性的,否则必须在线程间可见其更新。

10-06 10:34