Я хотел бы перенести функцию, JavaReentrantLock отлично работает в Java, но вызывает IllegalMonitorException в Scala
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. Я не вижу причин, почему это происходит.
Может ли кто-нибудь сказать мне, где проблема?
Ваш 'высчитывает 'метод в классе/признаке? Потому что в java-версии 'Lock' статична, поэтому перевод, что в scala означает, что он помещает его в объект, ** не ** в классе/признаке, где определяется' расчет'. –
Плюс, и это, вероятно, причина ошибки, вы определяете 'LOCK' как 'def', но это действительно должно быть' val'. В противном случае вы создаете новый замок каждый раз, когда вы ссылаетесь на 'LOCK', фактически делая бесполезным блокировку. –
Обычная практика заключается в приобретении замка перед попыткой, а не внутри. –