[Изучаю Java] Помогите найти ошибки в коде

luna89

В рамках изучения Java написал неполную реализацию интерфейса java.util.concurrent.locks.Lock
Прошу высказать критику
 

package myconcurrency;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class MyReentrantLock implements Lock {

private int lockCount = 0;
private Thread lockingThread;
private Object guard = new Object;

private boolean isLocked {
return lockCount > 0;
}

private void increaseLockCount {
lockCount++;
}

private void decreaseLockCount {
if (lockCount == 0)
throw new IllegalStateException("lockCount cannot be less than 0");
lockCount--;
}

private boolean isLockedByCurrentThread {
return Thread.currentThread.equals(lockingThread);
}

public MyReentrantLock {
}

@Override
public void lock {
synchronized (guard) {
if (isLockedByCurrentThread {
increaseLockCount;
return;
} else {
while (isLocked
try {
guard.wait;
} catch (InterruptedException e) {
}
lockingThread = Thread.currentThread;
increaseLockCount;
}
}
}

@Override
public boolean tryLock {
synchronized (guard) {
if (isLocked && !isLockedByCurrentThread
return false;
else {
lock;
return true;
}
}
}

@Override
public void unlock {
synchronized (guard) {
if (!isLockedByCurrentThread
throw new RuntimeException(
"Lock is not owned by current thread");
decreaseLockCount;
if (!isLocked {
lockingThread = null;
guard.notifyAll;
}
}
}

@Override
public void lockInterruptibly throws InterruptedException {
throw new RuntimeException("Not implemented");
}

@Override
public Condition newCondition {
throw new RuntimeException("Not implemented");
}

@Override
public boolean tryLock(long arg0, TimeUnit arg1)
throws InterruptedException {
throw new RuntimeException("Not implemented");
}

}

kokoc88

[troll]
В рамках изучения Java написал неполную реализацию интерфейса java.util.concurrent.locks.Lock
Может, стоит начать с чего-то попроще? Например, отсортировать массив пузырьком.
"lockCount cannot be less than 0"
[/troll]
catch (InterruptedException e) {
     }
Это ошибка.
synchronized (guard)

И вообще надо использовать атомарные операции, а ты всё сразу жёстко лочишь. Это будет работать медленно.

luna89

"lockCount cannot be less than 0"
Спасибо, исправил.
И вообще надо использовать атомарные операции, а ты всё сразу жёстко лочишь. Это будет работать медленно.
Производительность меня не интересует, только корректность.
Это ошибка.

Почему?

kokoc88

Почему?
Потому что interrupted state надо возвращать на место, а ты игнорируешь исключение и всё.

pitrik2

Потому что interrupted state надо возвращать на место, а ты игнорируешь исключение и всё.
эээ
для начала надо понять почему оно происходит
а потом уже правильно его обработать
но игнорировать да, по-любому неправильно
прога тогда может зависнуть если на крестик нажать

luna89

Потому что interrupted state надо возвращать на место, а ты игнорируешь исключение и всё.
Когда вылетает исключение, interrupted само устанавливается на false.

kokoc88

для начала надо понять почему оно происходит
И почему оно, по-твоему, происходит при Object.wait? И какие варианты там, по-твоему, есть, что флаг не нужно возвращать на место?

kokoc88

Когда вылетает исключение, interrupted само устанавливается на false.
Вот именно, поэтому надо вернуть его на место. (Читать: на true.)

pitrik2

И почему оно происходит при Object.wait?
официально: если этот поток хотят завершить
например при завершении программы
в таком случае не надо это исключение игнорировать
а надо предпринимать что-то осмысленное: например выставлять некий флаг, снимать все локи и больше никому не давать ставить локи говоря что мы сломались
[bred_mode]
неофицильно: сановская джава кидает этот эксепшн от балды
и хрен что с этим поделаешь
[/bred_mode]

pitrik2

Вот именно, поэтому надо вернуть его на место.
не понятно

kokoc88

официально: если этот поток хотят завершить
например при завершении программы
в таком случае не надо это исключение игнорировать
а надо предпринимать что-то осмысленное: например выставлять некий флаг, снимать все локи и больше никому не давать ставить локи говоря что мы сломались
Неправильно. В lock надо всё нормально залочить и вернуть флаг на место перед возвратом.
неофицильно: сановская джава кидает этот эксепшн от балды
и хрен что с этим поделаешь

Это что за сказки?

pitrik2

Неправильно. В lock надо всё нормально залочить и вернуть флаг на место перед возвратом.
и что дальше?
никто на этот флаг больше никогда не посмотрит
Это что за сказки?
суровая реальность
я на джаве уже давно не пишу, подробностей не помню

kokoc88

и что дальше?
никто на этот флаг больше никогда не посмотрит
Что за бред? На него никто не посмотрит, если ты его не восстановишь.
 
суровая реальность
я на джаве уже давно не пишу, подробностей не помню

А я на ней всё время пишу, и подробности помню. Может быть, тебе стоит освежить память, прежде чем говорить полную чушь?

katrin2201

суровая реальность
я на джаве уже давно не пишу, подробностей не помню
может быть ты со spurious wakeups путаешь?

luna89

Потому что interrupted state надо возвращать на место, а ты игнорируешь исключение и всё.
Да, ты прав. Спасибо за обсуждение.

pitrik2

может быть ты со spurious wakeups путаешь?
ой
от меня вчера проглючило
interrupt и wakeup спутал
Оставить комментарий
Имя или ник:
Комментарий: