2017-10-14 60 views
0

从Java并发Pactice为什么Java对象可以像锁和条件队列一样工作?

每个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对象可以作为一个锁作用,每个对象也可以 充当条件队列,和等待,通知,以及对象notifyAll的 方法构成了内在条件队列API。

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

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

  • 的实现了一些“条件队列”界面,或
  • 提供了一些方法,使物体的行为像鸭打字意义上的条件队列?

谢谢。

+2

“这是否意味着每个Java对象的类都实现了如下的Lock接口?”不,它意味着任何对象都可以用作'synchronized(表达式){...}'中的表达式。 –

+0

谢谢。 'synchronized'是什么类型的对象在圆括号中? – Ben

+2

[任何引用类型](https://docs.oracle.com/javase/specs/jls/se9/html/jls-14.html#jls-14.19)。这才是重点。 –

回答

1

不,这并不意味着每一个类实现了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实现。

相关问题