我是Java的新手,我无法理解以下代码:
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;
这里有什么锁?它的类型是什么?
修改
Lock是一个接口,无法实例化。看完构造函数后:
public Counter(){
lock = new ReentrantLock();
}
现在,一切都很清楚。 (感谢Bhushan Uniyal)
答案 0 :(得分:0)
问问Lock是如何在界面中实例化的?
锁定界面,由ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock
具有相同基本行为的重入互斥锁定 语义作为使用synchronized访问的隐式监视器锁 方法和陈述,但具有扩展功能。
ReentrantLock由最后成功锁定的线程拥有,但是 尚未解锁。线程调用锁将成功返回 当锁不是由另一个线程拥有时获取锁。该 如果当前线程已经拥有,则方法将立即返回 锁。这可以使用方法isHeldByCurrentThread()来检查 getHoldCount()。
此类的构造函数接受可选的fairness参数。 当设置为true时,在争用下,锁有利于授予访问权限 最长等待的线程。否则此锁不保证任何 特定的访问顺序。使用公平锁的程序由许多人访问 线程可以显示较低的总吞吐量(即,较慢;通常 比使用默认设置的那些慢得多,但要小一些 获得锁定的时间差异并保证缺乏饥饿。 但请注意,锁的公平性并不能保证公平性 线程调度。因此,使用公平锁定的许多线程之一可以 在其他活动线程连续多次连续获取它 没有进展,目前没有锁定。还要注意 不定时的tryLock方法不尊重公平性设置。它会 如果即使其他线程正在等待锁定也可以成功。
获取锁定。
如果锁没有被另一个线程持有并且返回,则获取该锁 立即将锁定保持计数设置为1。
如果当前线程已经保持锁定,则保持计数为 增加1,方法立即返回。
如果另一个线程持有锁,则当前线程变为 禁用用于线程调度的目的并且处于休眠状态直到 已获取锁定,此时锁定保持计数设置为 之一。
答案 1 :(得分:0)
Lock是一个接口,你需要提供它的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的同步块更复杂。锁(以及其他更高级的同步机制)是使用synchronized块创建的,因此我们不能完全摆脱synchronized关键字。
从Java 5开始,包java.util.concurrent.locks包含几个锁实现,因此您可能不必实现自己的锁。但是你仍然需要知道如何使用它们,知道它们实现背后的理论仍然是有用的。