为什么 Java 对象可以充当锁和条件队列?

Why can a Java object act like a lock and a condition queue?

来自Java实践中的并发

Every Java object can implicitly act as a lock for purposes of synchronization; these built-in locks are called intrinsic locks or monitor locks.

"Every Java object can implicitly act as a lock" 是什么意思?

是否意味着每个Java对象的class实现了如下Lock接口?

public interface Lock {    
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();    
}

这是否意味着每个 Java 对象的 class 都提供了一些方法,使对象在鸭子类型的意义上像锁一样?

Just as each Java object can act as a lock, each object can also act as a condition queue, and the wait, notify, and notifyAll methods in Object constitute the API for intrinsic condition queues.

"each object can also act as a condition queue"是什么意思?

是否表示每个Java对象的class

谢谢。

不,这并不意味着每个 class 都实现了 Lock 接口(事实上,该接口是在每个对象都有一个 implicit monitor 自 Java).

引入后实际上就存在了

这只是意味着每个对象都有一个隐式监视器,允许它用作简单的互斥锁,如下所示:

synchronized (someObject) {
  // this region is protected from concurrent execution by other threads
  // locking on the same object
}

它也可以用于更复杂的监视器用例,例如 wait()notify(),这使得它可以充当一种条件变量(这可能是条件变量?).

这个决定的好处和缺点有些激烈的争论:虽然它确实意味着你不需要单独的互斥锁或条件变量对象,但它给实施带来了负担,因为 any object 可以以这种方式使用,尽管可能只有极少数的 objects 曾经如此。有很多实施技巧被用来降低这个成本。

从 Java 5 开始,现在 JDK 提供了许多显式同步原语,包括各种 Lock 实现。