为什么Java对象可以像锁和条件队列一样?

时间:2017-10-14 22:40:12

标签: java types concurrency synchronization duck-typing

来自Pactice中的Java Concurrency

  

为了同步,每个Java对象都可以隐式充当锁;这些内置锁称为内部锁或   监视器锁。

“每个Java对象可以隐式地充当锁定”是什么意思?

是否意味着每个Java对象的类都实现了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对象的类都提供了一些方法,使得对象就像一个锁定,就像鸭子打字一样?

  

正如每个Java对象都可以充当锁,每个对象也可以   充当条件队列,以及wait,notify和notifyAll   Object中的方法构成内部条件队列的API。

“每个对象还可以充当条件队列”是什么意思?

是否意味着每个Java对象的类

  • 实现了一些“条件队列”接口,或
  • 提供了一些方法,使对象在鸭子打字的意义上就像条件队列一样?

感谢。

1 个答案:

答案 0 :(得分:0)

不,这并不意味着每个类都实现了Lock接口(事实上,在引入了每个对象都有隐式监视器自从引入Java以来​​,它几乎已经存在。)

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

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

它还可以用于更复杂的监视器用例,例如wait()notify(),这使它可以作为一种条件变量(这可能是条件变量?)。

这个决定的好处和缺点有些激烈争论:虽然它确实意味着你不需要单独的互斥或条件变量对象,但它会给实现带来负担,因为任何对象可以这样使用,即使可能是一小部分物体。有很多实现技巧可用于降低此成本。

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