【发布时间】:2016-04-08 08:45:56
【问题描述】:
我想迁移一个 Java 函数
protected static final Lock LOCK = new ReentrantLock();
public double calculate(...){
try {
LOCK.tryLock(20, TimeUnit.SECONDS);
...
}finally{
LOCK.unlock()
}
}
Scala 中的相同函数:
protected final def LOCK = new ReentrantLock
def calculate(...): double = {
try{
LOCK.tryLock(20, TimeUnit.Seconds)
...
}finally{
LOCK.unlock()
}
}
LOCK.unlock() 总是导致 IllegalMonitorStateException。我看不出发生这种情况的任何原因。
谁能告诉我问题出在哪里?
【问题讨论】:
-
你的
calculate方法是否在一个类/特征中?因为在 java 版本中Lock是静态的,所以在 scala 中翻译它意味着将它放在一个对象中,不是在定义calculate的类/特征中。 -
另外,这可能是错误的原因,您将
LOCK定义为def,但它实际上应该是val。否则,您每次引用LOCK时都会重新创建一个新锁,从而有效地使锁无用。 -
通常的做法是在尝试之前获取锁,而不是在里面。
-
calculate 方法在一个抽象类中。可能是因为另一个线程试图解锁这个 LOCK ?
标签: java multithreading scala concurrency reentrantlock