可以`LockSupport.park()`替换`Object.wait()`?

dyn*_*yng 2 java multithreading locking wait

目前我正在学习Java中的并发编程.我注意到LockSupport.park()在Java 1.6中介绍比Object.wait()使用容易得多,一般的用法Object.wait()就像

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

    // do stuff
}

// Thread2
synchronized (lock) {
    condition = true;
    lock.notify();
}
Run Code Online (Sandbox Code Playgroud)

而且我想我可以使用LockSupport.park()喜欢的方式重写它

// Thread1
while (condition != true) {
    LockSupport.park();
}

// do stuff

// Thread2
condition = true;
LockSupport.unpark(Thread1);
Run Code Online (Sandbox Code Playgroud)

通过使用LockSupport.park(),繁琐的synchroinzed块消失.

我的问题是,我总是喜欢LockSupport.park()比Object.wait()?是否有任何方面Object.wait()比LockSupport.park()性能更好?

Nat*_*hes 5

wait/notify背后的想法是通知不是线程特定的,通知程序不必知道需要通知的特定线程,它只是告诉锁定(或条件,对于ReentrantLock)它正在通知,并且他们之间的锁定和OS调度程序决定谁获得通知.

我希望通知程序大多数时候都不想知道哪个线程需要取消停放,所以wait/notify对于那些情况来说是更好的选择.使用park/unpark,您的代码必须了解更多,并且会有更多失败的机会.您可能认为同步块是乏味的,但真正繁琐的是整理出某些东西在它应该没有停放的情况.

请注意,在第二个示例中,您的条件需要是volatile或Atomic,或者是其他更新在线程中可见的内容.