我无法理解以下代码:
public class Counter {
private long value;
private Lock lock;
public long getAndIncrement() {
lock.lock();
try {
int temp = value;
value = value + 1;
} finally {
lock.unlock();
}
return temp;
}
}我无法理解的是,当Lock是接口时,它是如何被实例化的?如果它是一个实现Lock接口的匿名类,为什么我看不到Lock函数的任何重写(例如lock()和unlock() )?
简而言之,下面这句话真的让我感到困惑。
private Lock lock;这里的锁是什么?它的类型是什么?
编辑:
锁是一个接口,不能实例化。在查看构造函数之后:
public Counter(){
lock = new ReentrantLock();
}现在一切都很清楚了。(感谢布什汉大学)
发布于 2017-03-25 04:50:32
当Lock是接口时,它是如何实例化的?
锁定接口,由ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock实现
可重入的互斥锁,其基本行为和语义与使用同步方法和语句访问的隐式监视器锁相同,但具有扩展功能。 ReentrantLock属于线程最后成功锁定的线程,但尚未解除锁定。当锁不属于另一个线程时,调用锁的线程将返回成功获取该锁。如果当前线程已经拥有锁,则该方法将立即返回。可以使用isHeldByCurrentThread()和getHoldCount()方法来检查这一点。 这个类的构造函数接受一个可选的公平参数。当设置为true时,在争用项下,锁倾向于授予对等待时间最长的线程的访问权限。否则,此锁不保证任何特定的访问顺序。使用由许多线程访问的公平锁的程序可能比使用默认设置的程序显示更低的总体吞吐量(例如,速度较慢;通常要慢得多),但有时差异较小,以获得锁并保证缺乏饥饿。但是,请注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的多个线程中的一个可以连续多次获得该锁,而其他活动线程则没有进展,目前也没有保存该锁。还请注意,非定时tryLock方法不符合公平设置。如果锁可用,即使其他线程正在等待,它也会成功。
获得了锁。 如果锁未被另一个线程持有,则获取该锁,并立即返回,将锁保持计数设置为1。 如果当前线程已经持有锁,则保持计数将增加一个,并且该方法将立即返回。 如果锁由另一个线程持有,则当前线程将被禁用以用于线程调度,并且处于休眠状态,直到锁被获取,此时锁保持计数被设置为1。
发布于 2017-03-25 05:13:31
锁是一个接口,您需要提供它的Lock实现,已经有一些类提供了Lock、ReentrantReadWriteLock.ReadLock、ReentrantLockReentrant、ReadWriteLock.WriteLock,的实现,例如,Lock lock = new , ReentrantLockReentrant();也可以提供您自己的实现
public class MyLock implements Lock {
public void lock() {
}
public void lockInterruptibly() throws InterruptedException {
}
public boolean tryLock() {
return false;
}
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return false;
}
public void unlock() {
}
public Condition newCondition() {
return null;
}
}锁是像同步块一样的线程同步机制,除了
锁可能比Java的同步块更复杂。锁(和其他更高级的同步机制)是使用同步块创建的,因此我们不能完全消除同步关键字。
在Java5中,包java.util.concurrent.locks包含几个锁实现,因此您可能不必实现自己的锁。但是,您仍然需要知道如何使用它们,了解它们实现背后的理论仍然是有用的。
https://stackoverflow.com/questions/43012544
复制相似问题