首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java对象可以充当锁和条件队列?

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

Stack Overflow用户
提问于 2017-10-14 22:40:12
回答 1查看 883关注 0票数 1

来自Pactice中的Java并发性

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

“每个Java对象都可以隐式地充当锁”意味着什么?

这是否意味着每个Java对象的类都实现了Lock接口,如下所示?

代码语言:javascript
复制
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对象的类

  • 实现一些“条件队列”接口,或者
  • 提供一些方法,使对象在鸭子类型的意义上充当条件队列?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-15 22:18:00

不,这并不意味着每个类都实现了Lock接口(实际上,该接口是在引入了每个对象都有一个隐式监视器的概念之后创建的,这是自Java引入以来实际上已经存在的)。

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

代码语言:javascript
复制
synchronized (someObject) {
  // this region is protected from concurrent execution by other threads
  // locking on the same object
}

它还可以在更复杂的监视器用例中使用,比如wait()notify(),这就允许它充当一种条件变量(可能是条件变量的另一个名称?)。

这个决定的好处和缺点在一定程度上引起了激烈的争论:虽然它确实意味着您不需要单独的互斥对象或条件变量对象,但它给实现带来了负担,因为任何对象都可以以这种方式使用,尽管对象中可能有一小部分是这样使用的。有许多实现技巧被用来降低这种成本。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46750006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档