来自Pactice中的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对象的类
谢谢。
发布于 2017-10-15 22:18:00
不,这并不意味着每个类都实现了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实现。
https://stackoverflow.com/questions/46750006
复制相似问题