来自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对象的类
感谢。
答案 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
实现。